如何为 Trompeloeil 中的模拟对象数组设置相同的期望?

问题描述 投票:0回答:1

我有一组模拟对象,我需要为其中许多对象提供相同的期望。 我只能通过手动编写数组中每个对象的期望来成功。

正在测试的功能

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
循环不起作用。

c++ mocking catch2 trompeloeil
1个回答
0
投票

请改用

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.