结合 Pointwise 和 UnorderedElementsAreArray
Combining Pointwise & UnorderedElementsAreArray
我有两个指针数组,我想使用 gtest/gmock 断言它们包含相同的内容,可能顺序不同。我试过
vector<unique_ptr<int>> a;
vector<unique_ptr<int>> b;
a.push_back(make_unique<int>(42));
a.push_back(make_unique<int>(142));
b.push_back(make_unique<int>(142));
b.push_back(make_unique<int>(42));
// I want this to compile & pass
ASSERT_THAT(a, Pointwise(UnorderedElementsAreArray(), b));
但这没有用。
Gmock 并没有直接提供你想要的。问题在于,由于您的数组包含指针,因此您不能直接比较它们的元素,而必须为此使用匹配器。您可以从一个源数组构建一个匹配器数组,但这不会让事情变得更简单。
但是您有一些选择,具体取决于您的实际需要。如果你有两个数组,并且需要比较它们排序后是否相同,只需对数组进行排序:
auto sorted_a = std::sort(a.begin(), a.end(), [](auto x, auto y) {
return *x < *y;
});
auto sorted_b = std::sort(b.begin(), b.end(), [](auto x, auto y) {
return *x < *y;
});
然后定义一个辅助匹配器并使用它进行比较:
MATCHER(PointeesAreEqual, "") {
return *std::get<0>(arg) == *std::get<1>(arg);
}
EXPECT_THAT(a, Pointwise(PointeesAreEqual, b))
但是如果你只是想检查一个数组是否由某些元素组成,以任意顺序,你可以这样写:
EXPECT_THAT(a, UnorderedElementsAre(Pointee(42), Pointee(142));
我有两个指针数组,我想使用 gtest/gmock 断言它们包含相同的内容,可能顺序不同。我试过
vector<unique_ptr<int>> a;
vector<unique_ptr<int>> b;
a.push_back(make_unique<int>(42));
a.push_back(make_unique<int>(142));
b.push_back(make_unique<int>(142));
b.push_back(make_unique<int>(42));
// I want this to compile & pass
ASSERT_THAT(a, Pointwise(UnorderedElementsAreArray(), b));
但这没有用。
Gmock 并没有直接提供你想要的。问题在于,由于您的数组包含指针,因此您不能直接比较它们的元素,而必须为此使用匹配器。您可以从一个源数组构建一个匹配器数组,但这不会让事情变得更简单。
但是您有一些选择,具体取决于您的实际需要。如果你有两个数组,并且需要比较它们排序后是否相同,只需对数组进行排序:
auto sorted_a = std::sort(a.begin(), a.end(), [](auto x, auto y) {
return *x < *y;
});
auto sorted_b = std::sort(b.begin(), b.end(), [](auto x, auto y) {
return *x < *y;
});
然后定义一个辅助匹配器并使用它进行比较:
MATCHER(PointeesAreEqual, "") {
return *std::get<0>(arg) == *std::get<1>(arg);
}
EXPECT_THAT(a, Pointwise(PointeesAreEqual, b))
但是如果你只是想检查一个数组是否由某些元素组成,以任意顺序,你可以这样写:
EXPECT_THAT(a, UnorderedElementsAre(Pointee(42), Pointee(142));