2016-11-18 64 views
-1

我的模拟类看起来是这样的:如何测试包含随机值的字符串?

struct StringEater { 
    MOCK_CONST_METHOD1(ExecuteCommand, void(const char*)); 
}; 

和字符串包括不改变的一部分,我可以在测试不设置小部分。事情是这样的:

命令825完成

但它可以

命令123完成

"Command " + any number + " finished"

始终调用模拟类的方法。

那么,我该如何设置测试?这显然不能使用:

StringEater mock; 
EXPECT_CALL(mock, ExecuteCommand(StrEq(expectedJsonCmd))).Times(1); 

我需要为匹配器放什么?


此作品(感谢十):

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

这是如此的平凡简单的说,必须有一个catch ...这里有什么具体要求?我无法相信一位高级软件工程师和6年的36k专职兽医不知道如何解析一个令人震惊的常规字符串。 –

+0

@J ...从来没有做过正则表达式。尝试使用'MatchesRegex',但失败:( –

+0

@J ...好吧,有一些修复,我做了它的工作。谢谢,但为什么不回答? –

回答

0

所以它总是会跟一个整数后跟字符串"finished"字符串"Command"

然后可以尝试从字符串中提取这三个部分,比较第一部分和第三部分与预期字符串进行测试。

喜欢的东西

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 
} 
+0

其实字符串更复杂,并不那么简单。寻找一个gmock匹配器来测试这个字符串,现在我正在考虑使用'StartsWith'和'EndsWith',但我希望有人能够提出更好的建议。 –

0

你可以尝试使用正则表达式,你检查字符串是否以“命令”,并以“完成”结束,并提取作为一组数字。

类似的问题在另一篇文章中描述: Regex C++: extract substring

相关问题