在循环中添加预期的调用

Adding expected calls in a loop

本文关键字:调用 添加 循环      更新时间:2023-10-16

这就是我想要实现的。在我的测试夹具中,我想用参数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的所有调用都是相同的,但我想对第一、第二、第三、…执行不同的操作(参数取决于循环计数器i(。。。,第n次调用。无论参数n如何,当前实现都只期望对initialize进行一次调用。有没有可能解决这个问题并以某种方式保持循环,或者我必须为每个i添加一行WillOnce的操作?这意味着我必须检查n,并为n的不同可能值添加不同数量的WillOnce行,这是我真正想要避免的。

一种方法可以是使用Invoke。您可以编写一个可以访问handles容器的函数,以及一个正在运行的成员/静态变量(比如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;
}
相关文章: