所以我有定义的简单结构(几个字段)的实际和预期数据向量。
我发现匹配器
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 生成的坏例子淹没您:-)
我认为你应该使用这种方法:
#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)));
}