尝试使用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个或多个字符A
到F
发生错误是因为您在字符串的开头有*
,其中没有前面的字符,组等要重复。这本质上是一个正则表达式语法,语法错误和错误消息告诉你。
您实际需要的是一个文字*
,而不是属于语法的那个。要实现这一点,必须使用转义它。由于c++中的字符串也将反斜杠用作转义字符,因此也必须转义反斜杠。因此,在
*
之前需要两个反斜杠(或使用原始字符串文字)。
在紧要关头,解决方案应该是:
EXPECT_EXIT(test_Death(), testing::ExitedWithCode(EXIT_FAILURE), "\*Errorn");