我有一组模拟对象,我需要为其中许多对象提供相同的期望。 我只能通过手动编写数组中每个对象的期望来成功。
正在测试的功能
struct IWheel {
virtual bool is_flat() = 0;
};
bool all_tyres_ok( IWheel* wheels[4] )
{
return all_of(wheels, wheels+4, [](IWheel*w) {
return w->is_flat();
});
}
设定模拟的期望
struct MockWheel : public IWheel {
MAKE_MOCK0(is_flat, bool(), override);
};
TEST_CASE("test_wheels")
{
MockWheel w[4];
{
ALLOW_CALL(w[0], is_flat()).RETURN(true);
ALLOW_CALL(w[1], is_flat()).RETURN(true);
ALLOW_CALL(w[2], is_flat()).RETURN(false);
ALLOW_CALL(w[3], is_flat()).RETURN(true);
REQUIRE(all_tyres_ok(w) == false);
}
}
有没有办法对许多对象设置相同的期望?也许会超出某些人的期望?
for
循环不起作用。
请改用
NAMED_ALLOW_CALL
宏。
根据 trompeloeil 文档,当您使用
ALLOW_CALL
、FORBID_CALL
和 REQUIRE_CALL
宏时,它们基本上仅限于调用它们的范围。因此,您的 for 循环不起作用,因为您实际上需要从同一范围(即在 for 循环内)调用被测试的函数。
当然有时这是不可行的,比如你这里的情况。
解决这个问题的方法是使用
NAMED_ALLOW_CALL
宏,因为你需要将期望保持在 for 循环的范围之外。
类似于...
TEST_CASE("test_wheels")
{
using Expectation = std::unique_ptr<trompeloeil::expectation>;
Expectation expectations[4]
bool return_values[4] {true, true, false, true};
MockWheel w[4];
for (int i = 0; i < 4; i++)
{
expectations[i] = NAMED_ALLOW_CALL(w[i], is_flat()).RETURN(return_values[i]);
}
REQUIRE(all_tyres_ok(w) == false);
}