通过重复的操作顺序简化GTest案例

时间:2014-10-21 14:51:18

标签: c++ googletest

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

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();
    }

}

1 个答案:

答案 0 :(得分:1)

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上的函数调用。