在循环中添加预期调用
Adding expected calls in a loop
这就是我想要实现的。在我的测试夹具中,我想调用一个带有参数 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
)。无论参数 n
是什么,当前的实现都只会调用一次 initialize
。是否可以修复此问题并以某种方式使其保持循环,或者我是否必须为每个 i
添加带有 WillOnce
行的操作?这意味着我必须检查 n
并为 n
的不同可能值添加不同数量的 WillOnce
行,我真的想避免这种情况。
一种方法是使用 Invoke
。您可以编写一个可以访问 handles 容器的函数和一个 运行 member/static 变量(可以说是 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;
}
这就是我想要实现的。在我的测试夹具中,我想调用一个带有参数 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
)。无论参数 n
是什么,当前的实现都只会调用一次 initialize
。是否可以修复此问题并以某种方式使其保持循环,或者我是否必须为每个 i
添加带有 WillOnce
行的操作?这意味着我必须检查 n
并为 n
的不同可能值添加不同数量的 WillOnce
行,我真的想避免这种情况。
一种方法是使用 Invoke
。您可以编写一个可以访问 handles 容器的函数和一个 运行 member/static 变量(可以说是 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;
}