【发布时间】:2020-04-12 13:37:20
【问题描述】:
我的 C++ 代码需要一组有限的二维矩阵代数运算。我决定像这样使用std::array 来实现它:
template <typename T, size_t N, size_t M>
using array_2d = std::array<std::array<T, M>, N>;
我应该如何正确地为这种类型编写一个 GMock 匹配器来比较两个这样的双精度矩阵? 我想出了不那么聪明:
MATCHER_P(Arrays2dDoubleEq, expected, "") {
for (int i = 0; i < arg.size(); i++) {
for (int j = 0; j < arg[i].size(); j++) {
EXPECT_THAT(arg[i][j], DoubleEq(expected[i][j]));
}
}
return true;
}
MATCHER_P2(Arrays2dDoubleNear, expected, max_abs_err, "") {
for (int i = 0; i < arg.size(); i++) {
for (int j = 0; j < arg[i].size(); j++) {
EXPECT_THAT(arg[i][j], DoubleNear(expected[i][j], max_abs_err));
}
}
return true;
}
我使用的类似:EXPECT_THAT(result, Arrays2dDoubleEq(expected));
这不仅看起来很难编码,而且反馈也不好。当矩阵不匹配时,失败断言的输出是一堆不相等的双精度数。失败的测试输出难以阅读,并且缺少有关矩阵索引的信息。
我觉得可以(并且应该)以更好的方式完成。我已经看过一些文档和 GMock 食谱。虽然有一些容器匹配器,但我无法使用它们同时比较两个嵌套数组。
谁能指出我应该使用哪些 GMock 功能来改进这个匹配器?或者也许有人可以指出我应该更仔细阅读以了解我在这里可能遗漏的部分文档?
【问题讨论】:
标签: c++ unit-testing googletest matcher googlemock