我正在检查输出的字符串是否与预期的匹配,而不用担心它们的打印顺序。
在这里,
std::unordered_map
将 A
对象存储为值,并且由于它没有排序,因此变得棘手,因为输出可以是 foo\nbar\n
或 bar\nfoo\n
。
有什么方法可以在 google mock 中测试它?
class A
{
std::string _name;
public:
A(std::string name) : _name(name) {}
void foo()
{
std::cout << _name << "\n";
}
};
TEST(UnorderedMatch, A)
{
A a1{"foo"};
A a2{"bar"};
std::string expectedOut = "foo\nbar\n";
std::unordered_map<int, A> m1 = { {1, a1}, {2, a2} };
// test: foo()'s output matches expectedOut
// verify output is "foo\nbar\n" without worrying about its order
for (auto e : m1)
{
e.second.foo();
}
}
编辑: 对于投反对票的人,请首先就问题的问题提供反馈?
假设通过验证您的意思是使用 gmock 工具,您可以使用
UnorderedElementsAre
here。否则请参考评论中给出的建议。
请注意,使用
UnorderedElementsAre
需要在A
中使用比较运算符,所以我稍微改变了它的定义:
class A
{
std::string _name;
public:
auto operator<=>(A const&) const = default; // required by test
A(std::string name) : _name(name) {}
// ...
};
UnorderedElementsAre
用法示例:
TEST(UnorderedMatch, A)
{
A a1{"foo"};
A a2{"bar"};
std::unordered_map<int, A> m1 = { {1, a1}, {2, a2}, };
using namespace ::testing;
using std::string_literals::operator""s;
EXPECT_THAT(m1, UnorderedElementsAre( Pair(_, "bar"s), Pair(_, "foo"s) ));
}