繁体   English   中英

你如何模拟作为测试 gmock 的那个类的一部分的函数?

[英]How do you mock a function that is part of that class under test gmock?

我正在使用 googletest/googlemock (GTest/GMock)。 Selection自然返回 false 时,我只能测试下面的代码。 我将如何模拟下面的示例问题?

我很难改变选择的返回值,因为它使用了真实的代码。

class frame
{
    bool Selection();
    void Actions();
};

void frame::Action()
{
    if (Selection())
    {
        // do something
    }
    else
    {
        // do something else
    }
}

void WrapAction()
{
    Frame->Action();
}

TEST_F(UITest, ActionWithSelectionTrue)
{
    EXPECT_CALL(*Frame, Selection()).WillOnce(Return(true));

    WrapAction();
}

TEST_F(UITest, ActionWithSelectionFalse)
{
    EXPECT_CALL(*Frame, Selection()).WillOnce(Return(false));
    WrapAction();
}

传统的单元测试有A 3形式:

  1. 组装(也称为“排列”;设置您的测试对象)
  2. Act (对对象执行所需的操作)
  3. 断言(验证更改的正确值、发出的事件等)

这是一种有效的测试形式,根本不需要模拟框架。

在模拟测试中,您可能(取决于您的模拟库的工作方式)必须将此过程修改为A 4

  1. 组装(包括注入模拟依赖项)
  2. 预测(通过识别预期调用、设置返回值、副作用等来设置对模拟依赖项的期望)
  3. 行为
  4. 断言(如果模拟期望涵盖所有内容,则可能没有其他内容可断言)。

就您而言,目前尚不清楚您在嘲笑什么。 您正在注入并用模拟替换的依赖项在哪里?

鉴于您向我们展示的代码,我认为您应该使用A 3测试模式。 这意味着在“组装”部分,您可以通过设置选择来配置对象,然后对其执行操作并检查结果。

如果您不能在A 3模式中工作,这可能意味着您需要重构以更好地分离您的依赖项。 当您这样做时,您可以使用A 4模式进行模拟和测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM