你如何模拟一个在测试gmock下属于该类的函数?

问题描述 投票:1回答:1

我正在使用googletest / googlemock。当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();
}
c++ unit-testing gmock
1个回答
1
投票

传统的单元测试具有A3形式:

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

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

在使用模拟测试时,您可以(取决于模拟库的工作方式)将此过程修改为A4:

  1. 汇编(包括注入模拟依赖项)
  2. 预期(通过识别预期调用,设置返回值,副作用等来设置对模拟依赖项的期望)
  3. 法案
  4. 断言(如果模拟期望涵盖所有内容,可能没有别的断言)。

在你的情况下,你不清楚你在嘲笑什么。你用嘲笑取代的dependencies you are injecting在哪里?

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

如果您无法使用A3模式,这可能意味着您需要重构以更好地分离您的依赖项。当您这样做时,您可以使用A4模式进行模拟和测试。

© www.soinside.com 2019 - 2024. All rights reserved.