gtest:检查字符串是否等于两个字符串之一
gtest: check if string is equal to one of two strings
考虑我有两个字符串:
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
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 如何共享特定于两个类的逻辑?
- 为什么我的类只适用于两个构造函数 C++
- 如何将比较运算符应用于两个匿名结构中的每个变量
- 在不使用递归的情况下将 FFT 应用于两个非常大的数字的乘法
- 在 C++ 中存储为字符串的两个十六进制值上的 XOR
- C++交换字符串中两个字符的程序
- 试图将字符串的两个元素组合在一起会得到错误的结果(c++)
- 如何让代码存在于两个或多个非嵌套命名空间的范围内
- 如何创建具有不同项目字符串的两个不同的组合框
- C++:反转数组中的字符串.在两个不同的数组之间交换字符串
- 同一字符串的两个不同哈希值
- 一个数据结构的线性时间构造,如果两个字符串有两个共同的字母,则在常数时间内回答
- 删除字符串中两个字符(括号)之间的文本
- 如何使用逗号将字符串分成两个字符串,并存储字符串?(c++)
- 当函数依赖于两个不同的类时,避免进行类型检查
- 比较两个字符串(类似于GNUdiff的操作)