测试 std::unordered_map 中的内容而不用担心顺序

问题描述 投票:0回答:1

我正在检查输出的字符串是否与预期的匹配,而不用担心它们的打印顺序。

在这里,

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

编辑: 对于投反对票的人,请首先就问题的问题提供反馈?

c++ googlemock
1个回答
3
投票

假设通过验证您的意思是使用 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) ));
}
© www.soinside.com 2019 - 2024. All rights reserved.