gpt4 book ai didi

c++ - 如何在内联回调函数中使用 EXPECT_EQ 和其他 Google Mock 语句?

转载 作者:行者123 更新时间:2023-11-28 04:27:33 32 4
gpt4 key购买 nike

假设我有这个测试用例:

TEST_F(TestCase1, HappyCase){
foo->doSomething(arg1, new inlineCallback([=](bool success){
EXPECT_EQ(success, true);
}));
}

但是:

EXPECT_EQ(success, true)

只会在您实际调用 inlineCallback 并在 foo 类的 doSomething 函数的实现中传递一个 bool 值时被调用。

但也可能是实现非常复杂,并且有可能永远不会调用 inlineCallback,那么 EXPECT_EQ(success, true) 将不会被调用,这个测试用例几乎没有用。

我如何始终确保 EXPECT_EQ(success, true) 始终得到评估?

最佳答案

一个简单的方法是通过引用捕获一个 bool 值并在回调中将其设置为 true:

TEST_F(TestCase1, HappyCase) {
bool callback_called = false;

foo->doSomething(arg1, new inlineCallback([&callback_called, =](bool success) {
callback_called = true;
EXPECT_TRUE(success);
}

EXPECT_TRUE(callback_called);
}

如果你的回调都有一个共同的(抽象的)基类,它们继承自(inlineCallback 类的存在强烈暗示),那么你也可以改用 Googlemock 及其参数匹配器:

// assuming this is the callback interface
class Callback {
public:
Callback() = default;
Callback(Callback const&) = delete;
Callback(Callback&&) = delete;
Callback& operator=(Callback const&) = delete;
Callback& operator=(Callback&&) = delete;
virtual ~Callback() = default;

virtual void operator()(bool) = 0;
};

class MockCallback : public Callback {
public:
// since Googlemock can't mock operators directly we add one level
// of indirection
MOCK_METHOD1(calledWith, void(bool));

void operator()(bool const arg) override {
calledWith(arg);
}
};

TEST_F(TestCase1, HappyCase) {
auto callback = std::make_unique<::testing::StrictMock<MockCallback>>();

EXPECT_CALL(*callback, calledWith(true));

foo->doSomething(arg1, callback.release());
}

关于c++ - 如何在内联回调函数中使用 EXPECT_EQ 和其他 Google Mock 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53934483/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com