使用C ++ GMock匹配器测试unordered_map的键是否来自一组键

问题描述 投票:0回答:1

让我说以下内容:

unordered_map<string, int> map{{"foo", 1}, {"bar", 2}, {"baz", 3}};
vector<string> expected_keys{"foo", "bar", "kaz"}; // Note "kaz" not "baz"

并且我想测试来自map的键是否全部包含在expected_keys的集合中。

我真正想写的是:

EXPECT_THAT(map, Each(Key(From(expected_keys))));

但是据我所知,没有任何东西支持From模式;也就是说,检查一个值是否来自一组值。匹配器库似乎假设您将一直执行set contains value,而永远不会执行value is in set。在每种情况下,这些都是等效的。而且,如果unordered_map具有keys() API,则可以使用简单的UnorderedElementsAreArray(expected_keys)将其放入模式中。但事实并非如此。

我能想到的最接近的是:

EXPECT_THAT(map, Each(Key(ResultOf([&](const key&){return Value(expected_keys, Contains(key));}, IsTrue())))

哪个...太可怕了。 Pointwise()确实很接近,但是搜索的有序性使其不适用于无序的容器。

是否有一种方法可以直接进行这种查询而无需求助于ResultOf()Value()?还是我以错误的方式思考问题?

c++ googletest gmock
1个回答
0
投票
auto KeyMatch(const vector<string>& keys) {
  vector<decltype(Key(keys[0]))> matchers;
  for (const auto& val : keys) {
    matchers.push_back(Key(val));
  }
  return UnorderedElementsAreArray(matchers);
};

....
ASSERT_THAT(map, KeyMatch(keys));
© www.soinside.com 2019 - 2024. All rights reserved.