c++ - 通过重复的操作序列简化 GTest 用例

标签 c++ googletest

我需要测试 MyController 是否使用不同的值重复调用一系列操作。下面是相关的代码,如何简化重复 block 调用不同值的相同操作?

class MyControllerTest : public ::testing::Test
{
protected:
    MyControllerTest() :
        m_mycontroller(m_dataBroker, m_eventBroker)
    {
    }

    testing::MockDataBroker m_dataBroker;
    testing::MockEventBroker m_eventBroker;
    MyController m_mycontroller;
};


TEST_F(MyControllerTest, ConfigureSequence)
{

    {
        InSequence dummy;
        EXPECT_CALL(m_dataBroker, Prepare());
        EXPECT_CALL(m_dataBroker, SetItem(Data::ID, SP::ITEM_1));
        EXPECT_CALL(m_dataBroker, End());
        EXPECT_CALL(m_eventBroker, DispatchEvent(Events::ADD, _));
        m_mycontroller.Event(Events::ADDED);

        EXPECT_CALL(m_dataBroker, Prepare());
        EXPECT_CALL(m_dataBroker, SetItem(Data::ID, SP::ITEM_2));
        EXPECT_CALL(m_dataBroker, End());
        EXPECT_CALL(m_eventBroker, DispatchEvent(Events::ADD, _));
        m_mycontroller.Event(Events::ADDED);

        EXPECT_CALL(m_dataBroker, Prepare());
        EXPECT_CALL(m_dataBroker, SetItem(Data::ID, Event::SP::ITEM_3));
        EXPECT_CALL(m_dataBroker, End());
        EXPECT_CALL(m_eventBroker, DispatchEvent(Events::ADD, _));
        m_mycontroller.Event(Events::ADDED);

        EXPECT_CALL(m_dataBroker, Prepare());
        EXPECT_CALL(m_dataBroker, SetItem(Data::ID, Event::SP::ITEM_4));
        EXPECT_CALL(m_dataBroker, End());
        EXPECT_CALL(m_eventBroker, DispatchEvent(Events::ADD, _));
        m_mycontroller.Event(Events::ADDED);

        EXPECT_CALL(m_dataBroker, Prepare());
        EXPECT_CALL(m_dataBroker, SetItem(Data::ID, Event::SP::ITEM_5));
        EXPECT_CALL(m_dataBroker, End());
        EXPECT_CALL(m_eventBroker, DispatchEvent(Events::ADD, _));
        m_mycontroller.Event(Events::ADDED);

        m_mycontroller.start();
    }

}

最佳答案

for 循环就足够了

const vector<...> items = {Event::SP::ITEM_1, Event::SP::ITEM_2, ...};
for (const auto& item : items) {
  EXPECT_CALL(m_dataBroker, Prepare());
  EXPECT_CALL(m_dataBroker, SetItem(Data::ID, SP::ITEM_1));
  EXPECT_CALL(m_dataBroker, End());
  EXPECT_CALL(m_eventBroker, DispatchEvent(Events::ADD, _));
  m_mycontroller.Event(Events::ADDED);
}
m_mycontroller.start();

EXPECT_CALL 宏没有什么特别之处。它们的底层只是对模拟对象 m_dataBroker 的简单函数调用。

关于c++ - 通过重复的操作序列简化 GTest 用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26489674/

相关文章:

c++ - 如何模拟将对象引用作为参数的函数 - 谷歌测试

c++ - 如何为网络客户端编写单元测试?

c++ - 析构函数与重载删除

c++ - MySQL 结果集包含 1 行,但调用 getstring 导致访问冲突

c++ - Iceberg 类和 Google 单元测试

c++ - 将可选的隐式转换为 bool 值?

c++ - 如何在 Windows 中管理 googletest 中的断言

c++ - DirectX DXUT 备用 API

c++ - 双线性图像采样不可重现的访问冲突

C++ 如何创建双类运算符 [][]