gtest:检查字符串是否等于两个字符串之一

gtest: check if string is equal to one of two strings

本文关键字:字符串 于两个 是否 检查 gtest      更新时间:2023-10-16

考虑我有两个字符串:

std::string s1 = "ab"; 
std::string s2 = "cd";

我想检查(例如使用 EXPECT_EQ)某些给定std::string str是否等于s1s2.

如果 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_STREQEXPECT_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