我正在使用 gtest 为我的c ++程序创建单元测试。在我的测试中,我必须编写很多这样的检查:
ASSERT_TRUE(myObject.IsValid());
EXPECT_EQ(myObject.GetSomeAttribute(), expectedValue);
我必须编写两个检查,因为如果我省略ASSERT_TRUE
而myObject
碰巧无效,则myObject.GetSomeAttributre()
调用崩溃。即使在测试中,这也不好。
我想要的是写下这样的东西:
EXPECT_XXX_EQ(myObject.GetSomeAttribute(), expectedValue);
这行代码应该与原来的两行大致相同(如果myObject
无效,则会有可选的奖励,这将被报告,GetSomeAttribute()
将不被调用,但是测试将继续运行。)
如何编写自定义断言/期望?
答案 0 :(得分:3)
从Advanced Guide,我们可以看到有几种方法可以做到这一点。
最简单的方法是using assertions in a subroutine:
template<typename T>
void AssertAttributeEquals(MyObject const& obj, T value) {
ASSERT_TRUE(obj.IsValid());
// googletest has the assumption that you put the
// expected value first
EXPECT_EQ(value, obj.GetAttribute());
}
你可以这样称呼它:
AssertAttributeEquals(myObject, expectedValue);
虽然您可能希望使用SCOPED_TRACE
在失败时获得更好的消息:
{
SCOPED_TRACE("whatever message you want");
AssertAttributeEquals(myObject, expectedValue);
}
或者,你可以use a function that returns an AssertionResult
:
template<typename T>
::testing::AssertionResult AttributeEquals(MyObject const& obj, T value) {
if (!obj.IsValid()) {
// If MyObject is streamable, then we probably want to include it
// in the error message.
return ::testing::AssertionFailure() << obj << " is not valid";
}
auto attr = obj.GetAttribute();
if (attr == value) {
return ::testing::AssertionSuccess();
} else {
return ::testing::AssertionFailure() << attr << " not equal to " << value;
}
}
这可以这样使用:
EXPECT_TRUE(AttributeEquals(myObject, expectedValue));
即使您不使用SCOPED_TRACE