谷歌测试错误:'*'只能遵循可重复的令牌



尝试使用EXPECT_EXIT创建一些单元测试,其中错误消息包含'*'。测试失败了,但没有出现预期的错误。我在这里缺少什么?

这里有一个非常简单的例子来重现这个问题:

void test_Death() {
std::cerr << "*Errorn";
exit(EXIT_FAILURE);
}
TEST(ErrorWithStar, Star) {
EXPECT_EXIT(test_Death(), testing::ExitedWithCode(EXIT_FAILURE), "*Errorn");
}

结果是:

消息:

#1 - Failed
Syntax error at index 0 in simple regular expression "*Error
": '*' can only follow a repeatable token.
Running main() from c:a1sthirdpartygoogletestgoogletestsrcgtest_main.cc
#2 - Death test: test_Death()
Result: died but not with expected error.
Expected: *Error
Actual msg:
[  DEATH   ] *Error
[  DEATH   ]

我正在使用Microsoft Visual Studio Community 2019 Version 16.11.13。我在我的解决方案中添加了一个谷歌测试项目,创建了所有链接等。它可以完美地用于其他所有内容,但不能用于包含'*'的消息。

"*"只能跟在一个可重复的标记"&"后面是什么意思?

字符*由正则表达式语法保留,表示匹配零个或多个前面的令牌或组。

一些简单的例子:

  • .*匹配0个或多个字符
  • a*匹配0个或多个字符a
  • [A-F]*匹配0个或多个字符AF

发生错误是因为您在字符串的开头有*,其中没有前面的字符,组要重复。这本质上是一个正则表达式语法,语法错误和错误消息告诉你。

您实际需要的是一个文字*,而不是属于语法的那个。要实现这一点,必须使用转义它。由于c++中的字符串也将反斜杠用作转义字符,因此也必须转义反斜杠。因此,在*之前需要两个反斜杠(或使用原始字符串文字)。

在紧要关头,解决方案应该是:

EXPECT_EXIT(test_Death(), testing::ExitedWithCode(EXIT_FAILURE), "\*Errorn");

最新更新