Gmock只期待一个特定的电话

时间:2015-10-27 19:12:38

标签: c++ unit-testing googlemock gmock

我有一个C ++类,我试图用GMock测试。我有以下模拟类:

if request.user.is_staff:
    forecasts = Forecast.objects.filter(workflow_state__in=[1,2,3,4])

然后在我的测试中发生以下情况:

class MyTestMock
{
    public:
        MOCK_METHOD1(myCoolMethod, int(const char*));
        MOCK_METHOD1(myCoolMethod, int(string));
}

我想要做的是允许前两个调用是不感兴趣的调用,返回整数的默认值0,而我在第三次调用时设置一个特定的期望返回1.这是我尝试这样做的:

MyTestMock myMock;
if ( myMock.myCoolMethod("stuff") )
{
    // Stuff I don't care about, don't want to execute
}
if ( myMock.myCoolMethod("moarStuff") )
{
    // More stuff I don't care about, don't want to execute
}
if ( myMock.myCoolMethod("foo") )
{
    // This I care about and want to execute
}

然而,这最终导致测试失败。如果我这样做:

EXPECT_CALL(myMock, myCoolMethod(TypedEq<const char *>("foo"))).WillOnce(Return(1));

我的考试顺利通过。我试图在一个旧的,庞大的,单片式的代码库上尽可能地使单元测试变得无痛,所以我真的不想要额外的魔术线来告诉它返回默认值。关于如何在不考虑测试的情况下实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:0)

我想我的回答并不是很好,而是预期的#34;用于测试&#34;一个古老的,庞大的,单片式的代码库&#34;可能有大量此类CoolMethods ...,但不幸的是,这就是google-mock的工作方式。正如您可以阅读FAQ

  

在测试的设置部分中使用ON_CALL并不意味着   电话是预期的。如果没有EXPECT_CALL且方法是   叫,这可能是一个错误。如果我们静静地让电话通过   在没有通知用户的情况下,错误可能会被忽视。

同样是&#34;默认&#34; ON_CALL - 我的意思是当你没有明确地写ON_CALL时,因为类型的默认值(在你的情况下是0 int)完全没问题。

我的建议是始终将这样的一般期望放在测试套件的SetUp函数中 - 这样你的测试用例就不会超出许多神奇的期望:

class MyTestSuite : public ::testing::Test
{
protected:
    MyTestMock myMock;
    void SetUp() override
    {
        EXPECT_CALL(myMock, myCoolMethod(Matcher<const char *>(_))).WillRepeatedly(Return(0));
    }   
};

这样你就会烦恼&#34;行只在一个地方,你的测试用例是&#34;清除&#34;:

TEST_F(MyTestSuite, shallDoSomethingWhenCoolMethodAcceptsFoo)
{
   EXPECT_CALL(myMock, myCoolMethod(TypedEq<const char *>("foo"))).WillOnce(Return(1));
}
TEST_F(MyTestSuite, shallDoSomethingElseWhenCoolMethodAcceptsMoarStuff)
{
   EXPECT_CALL(myMock, myCoolMethod(TypedEq<const char *>("moarStuff"))).WillOnce(Return(1));
}