结合 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));