我的模拟课看起来像这样:
struct StringEater {
MOCK_CONST_METHOD1( ExecuteCommand, void( const char* ) );
};
并且字符串由不变的部分和我在测试中无法设置的小部分组成。像这样:
命令825完成
但它可以是
命令123完成
或"Command " + any number + " finished"
。
始终调用mock类中的方法。
那么,我该如何设置测试?这显然不能用:
StringEater mock;
EXPECT_CALL( mock, ExecuteCommand( StrEq( expectedJsonCmd ) ) ).Times( 1 );
我需要为匹配器提供什么?
这有效(感谢J):
TEST( abc, some )
{
struct StringEater {
MOCK_CONST_METHOD1( ExecuteCommand, void( const char* ) );
};
StringEater eater;
EXPECT_CALL( eater, ExecuteCommand( MatchesRegex( "Command\\s([0-9]*)\\sfinished" ) ) ).Times( 1 );
eater.ExecuteCommand( "Command 643 finished" );
}
答案 0 :(得分:0)
所以它总是字符串"Command"
后跟一个整数后跟字符串"finished"
?
然后可以通过尝试从字符串中提取这三个部分来测试它,将第一个和第三个部分与预期的字符串进行比较。
像
这样的东西std::istringstream iss(the_input_string);
std::string s1, s3;
int i2;
if (iss >> s1 >> i2 >> s3)
{
if (s1 == "Command" && s3 == "finished")
{
// Test succeeded
}
else
{
// Test failed
}
}
else
{
// Failed, not correct format
}
答案 1 :(得分:0)
您可以尝试使用regexp检查字符串是以“Command”开头,还是以“finished”结尾,并将该数字作为一组提取。
在另一篇文章中描述了类似的问题: Regex C++: extract substring