考虑我有两个字符串:
std::string s1 = "ab";
std::string s2 = "cd";
并且我想检查(例如使用 EXPECT_EQ)某些给定的
std::string str
是否等于 s1
或 s2
。
如果 gtest 的
ASSERT_*
和 EXPECT_*
会返回 bool
我可以写
EXPECT_TRUE(EXPECT_EQ(str, s1) || EXPECT_EQ(str, s2));
但是,不幸的是,他们没有。
在这种情况下,
EXPECT_TRUE
有一个问题。在gtest的文档中,它被描述为:
有时用户必须使用 EXPECT_TRUE() 来检查复杂的 表达式,因为缺乏更好的宏。这有一个问题不 向您显示表达式各部分的值,使其变得困难 了解出了什么问题。
所以建议使用
EXPECT_PRED
:
TEST(CompareStr, Test1) {
std::string s1 = "ab";
std::string s2 = "cd";
std::string str;
EXPECT_PRED3([](auto str, auto s1, auto s2) {
return str == s1 || str == s2;}, str, s1, s2);
}
如果单元测试失败,它可以提供更好的诊断:
[ RUN ] CompareStr.Test1
Test.cpp:5: Failure
[](auto str, auto s1, auto s2) { return str == s1 || str == s2;}(str, s1, s2) evaluates to false, where
str evaluates to
s1 evaluates to ab
s2 evaluates to cd
您可以将上面的消息与
EXPECT_TRUE
的输出进行比较:
Value of: s1 == str || s2 == str
Actual: false
Expected: true
尝试一下:
std::string s1 = "ab";
std::string s2 = "cd";
std::string str = "ab";
EXPECT_TRUE(s1 == str || s2 == str);
使用
ASSERT_STREQ
或 EXPECT_STREQ
代替 EXPECT_EQ
来比较字符串。因此,您需要将 std::string
转换为 C 字符串。
举个例子:
std::string s1 = "ab";
std::string s2 = "cd";
ASSERT_STREQ(s1.c_str(), s2.c_str());
参考:https://github.com/google/googletest/blob/main/docs/reference/assertions.md