C++ 使用googletest对两个地图进行彻底的平等性测试

C++ 使用googletest对两个地图进行彻底的平等性测试,c++,c++11,googletest,C++,C++11,Googletest,我想知道使用谷歌测试框架测试两个std::maps的相等性的“正确/最佳”方法是什么 问题是std::map在值中有一些指针,我想测试它们指向的东西在两个std::maps中是否正确 例如,“我的地图”具有以下签名: std::map 因此,我想确保MyClass1和MyClass2指针的值在我测试的两个映射中是相同的。如果操作符==不是选项,则可以定义匹配器: using mymap = std::map<int, std::vector<std::pair<MyClass

我想知道使用谷歌测试框架测试两个
std::map
s的相等性的“正确/最佳”方法是什么

问题是
std::map
在值中有一些指针,我想测试它们指向的东西在两个
std::map
s中是否正确

例如,“我的地图”具有以下签名:

std::map

因此,我想确保
MyClass1
MyClass2
指针的值在我测试的两个映射中是相同的。

如果
操作符==
不是选项,则可以定义匹配器:

using mymap = std::map<int, std::vector<std::pair<MyClass1 *, MyClass2 *>>>;

MATCHER_P(MAP_MATCHER, expected_map, "Maps are not equal") {
  if (expected_map.size() != arg.size()) {
    return false;
  }
  return std::all_of(expected_map.cbegin(), expected_map.cend(), [&](const std::pair<int, std::vector<std::pair<MyClass1 *, MyClass2 *>>> &item) {
  auto arg_item = arg.find(item.first);
    if (arg.cend() == arg_item) {
      return false;
    }
    //more checks here
  });
}

只需定义
bool操作符==(constyourmap&lhs,constyourmap&rhs)
,谷歌测试将在
ASSERT\ueq
中使用它。你试过了吗?成功了吗?是的,我现在就是这样做的。但感觉很“黑”。如果这确实是最好的方法,那就这样吧,但我希望用gtest找到一种更干净、测试更好的方法。这在很多地方都有讨论,我没有看到任何明确的结论:。您可以始终执行
ASSERT\u TRUE(mapsEqual(map1,map2))
,但如果您有一些比较类型的明确策略,只需定义
操作符==
。这不是黑客行为,只是取决于你的应用程序。
TEST(maptest, test1) {
  mymap m1{{1, {{new MyClass1{}, new MyClass2{}}}}};
  mymap m2{{1, {{new MyClass1{}, new MyClass2{}}}}};

  ASSERT_THAT(m1, MAP_MATCHER(m2));
}