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