Как использовать EXPECT_EQ и другие операторы Google Mock во встроенной функции обратного вызова? - PullRequest
0 голосов
/ 26 декабря 2018

Скажите, что у меня есть этот тестовый случай:

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

Но:

EXPECT_EQ(success, true)

будет вызываться только тогда, когда вы на самом деле вызовите inlineCallback , передавая логическое значение вреализация функции doSomething класса foo.

Но может случиться так, что реализация будет очень сложной, и есть вероятность, что inlineCallback никогда не будет вызван, тогда EXPECT_EQ (success, true)не будет вызван, и этот тестовый пример в значительной степени бесполезен.

Как я всегда могу убедиться, что EXPECT_EQ (success, true) всегда будет оцениваться?

1 Ответ

0 голосов
/ 26 декабря 2018

Один простой способ сделать это - также захватить логическое значение по ссылке и установить для него значение 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);
}

Если все ваши обратные вызовы имеют общий (абстрактный) базовый класс, который они наследуютfrom (что настоятельно рекомендует существование класса 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());
}
...