如何测试包含随机值的字符串?

时间:2016-11-18 10:39:57

标签: c++ gmock

我的模拟课看起来像这样:

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

2 个答案:

答案 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