用googletest彻底测试两张地图

时间:2019-07-03 14:28:55

标签: c++ c++11 googletest

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

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

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

std::map<int, std::vector<std::pair<MyClass1*, MyClass2*>>>

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

1 个答案:

答案 0 :(得分:1)

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

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
  });
}

然后使用它:

TEST(maptest, test1) {
  mymap m1{{1, {{new MyClass1{}, new MyClass2{}}}}};
  mymap m2{{1, {{new MyClass1{}, new MyClass2{}}}}};

  ASSERT_THAT(m1, MAP_MATCHER(m2));
}