GTEST 匹配器来比较给定结构的向量

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

所以我有定义的简单结构(几个字段)的实际和预期数据向量。

我发现匹配器

UnorderedElementsAreArray()
可以“作用于”实际值并获取预期向量作为要比较的参数。

不太重要的细节:array_expected是在test中计算的,array_under_test是在mock的expect调用上使用SaveArg<>存储的。

我无法将

operator==()
添加到该结构定义中,但这正是编译器想要的(比较向量的元素)。

我试图开发一些匹配器链,所以最初我打电话:

EXPECT_THAT(array_under_test, UnorderedElementsAreArray(array_expected));

调用提到的 gtest 匹配器来处理数组/向量,但我想提供自定义匹配器,将“arg”与提供的“预期”元素进行比较,并在我知道对象相等时返回 true/false(匹配器应该这样做)(仅很少有领域真正重要)。

我不知道如何将 UnorderedElementsAreArray 与 MyMatcher 链接起来

MATCHER_P(MyMatcher, expected, "") {
  return arg.field1 == expected.field1;
}

尝试了一些方法,但没有成功。不想用 chatgpt 生成的坏例子淹没您:-)

c++ googletest googlemock matcher
1个回答
0
投票

我认为你应该使用这种方法:

#include <gtest/gtest.h>
#include <gmock/gmock.h>

struct CustomStruct {
    int field1;
    double field2;
    char field3;
};

MATCHER_P(Field1Is, m, "") {
    return ExplainMatchResult(testing::Field(&CustomStruct::field1, m),
                              arg,
                              result_listener);
}


TEST(SomeFunctionalityTest, dummyTest) {
    std::vector<CustomStruct> array_under_test{ {1, 1.0, 'a'}, {2, 2.0, 'b'}};

    EXPECT_THAT(array_under_test, testing::UnorderedElementsAre(Field1Is(1), Field1Is(2)));
    EXPECT_THAT(array_under_test, testing::UnorderedElementsAre(Field1Is(2), Field1Is(1)));
    EXPECT_THAT(array_under_test, testing::UnorderedElementsAre(Field1Is(2), Field1Is(3)));
}

https://godbolt.org/z/GabKdvo4K

© www.soinside.com 2019 - 2024. All rights reserved.