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

问题描述 投票:0回答:3

考虑我有两个字符串:

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));

但是,不幸的是,他们没有。

c++ googletest
3个回答
13
投票

在这种情况下,

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

8
投票

尝试一下:

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

EXPECT_TRUE(s1 == str || s2 == str);

0
投票

使用

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

© www.soinside.com 2019 - 2024. All rights reserved.