【问题标题】:Adding expected calls in a loop在循环中添加预期调用
【发布时间】:2016-08-08 09:47:38
【问题描述】:

这就是我想要实现的。在我的测试夹具中,我想调用带有参数n 的辅助函数来告诉测试夹具应该预期多少个初始化序列。序列中使用的一些参数存储在三个std::vector 容器中; fileDescriptor, handle, selectionObject.

我写的是这样的:

void MyTest::init_Ok(uint32_t n)
{
  for (uint32_t i = 0; i < n; ++i)
  {
    fileDescriptor.push_back(i); // FDs starting at 0
    handle.push_back(reinterpret_cast<void*>(18 + i)); // handles starting at 18
    selectionObject.push_back(555 + i); // SOs starting at 555

    EXPECT_CALL(MyMockApi::getApi(), initialize(Pointee(nullptr), StrEq("InitString"), MyMatcher()))
      .WillOnce(DoAll(SetArgPointee<0>(handle[i]),
                      Return(INIT_OK)));
    EXPECT_CALL(MyMockApi::getApi(), selectionObjectGet(handle[i], Pointee(nullptr)))
      .WillOnce(DoAll(SetArgPointee<1>(selectionObject[i]),
                      Return(SELECTION_OK)));
    EXPECT_CALL(MyMockApi::getApi(), finalize(handle[i]))
      .WillOnce(Return(FINAL_OK));
  }
}

我知道为什么它不起作用。预计对initialize 的所有调用都是相同的,但我想对第一个、第二个、第三个、...、第 n 个调用执行不同的操作(参数取决于循环计数器i)。当前的实现只期望对initialize 进行一次调用,而不管参数n。是否可以解决此问题并以某种方式使其保持循环,或者我是否必须为每个i 添加带有WillOnce 行的操作?这意味着我必须检查n 并为n 的不同可能值添加不同数量的WillOnce 行,我真的想避免这种情况。

【问题讨论】:

    标签: c++ unit-testing googletest gmock


    【解决方案1】:

    一种方法是使用Invoke。您可以编写一个函数,该函数可以访问句柄容器和一个正在运行的成员/静态变量(比如说 counterVar),该变量将指示该函数被命中的次数。根据counterVar的值,你可以决定逻辑。

    .WillRepeatedly(Invoke(<your function>))
    

    类似:

    EXPECT_CALL(MyMockApi::getApi(), initialize(Pointee(nullptr), StrEq("InitString"), MyMatcher()))
          .WillRepeatedly(Invoke(successfulInitialize));
    
    ReturnCode successfulInitialize(void* op, std::string msg)
    {
       static int counterVar = 0;
       *op = handles[counterVar++];
       return INIT_OK;
    }
    

    【讨论】:

    • @MartinG,我知道这是一篇旧帖子,但我现在遇到了同样的问题。你是怎么解决的?
    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2023-03-25
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2016-12-03
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多