如何使用 gtest 验证带有自定义键的地图项?
how to validate map items with custom key using gtest?
我已经为我的地图编写了自定义键
struct custom_key {
string id;
string sector;
bool operator==(const custom_key& other) {
// I'm needed by gtest
return id == other.id && sector == other.sector;
}
};
我添加了 less then overload
namespace std
{
template<> struct less<custom_key>
{
bool operator() (const custom_key& lhs, const custom_key& rhs) const
{
return lhs.id < rhs.id;
}
};
}
我也定义了匹配器
MATCHER_P(match_eq, value, "")
{
return arg == value;
}
我试着写了一个测试
EXPECT_CALL(
*stats_,
stats(
AllOf(
Field(&data,
Contains(
Pair(
custom_key{"id", "name"},
match_eq("expected_value")
)
)
)
)
);
我运行反对
std::map<custom_key, std::string> my_map = { {"id", "name"}, "expected_value" }
gtest 说他没有找到匹配项。我迷路了。
由于在 gtest 的实现中广泛使用模板,我找不到调试它的任何帮助。
任何想法将不胜感激。
我在这里看到的第一个问题是您的 operator==
没有 const
限定符。你需要这样的东西:
bool operator==(const custom_key& other) const {
// I'm needed by gtest
return id == other.id && sector == other.sector;
}
下一个,
I've run it against std::map<custom_key, std::string> my_map = { {"id", "name"}, "expected_value" }
这不会编译,你需要额外的大括号来初始化 std::pair<custom_key, std::string>
之后会初始化 std::map
。
您没有解释您在 EXPECT_CALL 中执行的所有检查,但看起来您对使用 Contains.
进行容器验证有了大致的了解
std::map 验证的完整解决方案如下所示:
#include <map>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace ::testing;
using namespace std;
struct custom_key {
string id;
string sector;
bool operator==(const custom_key& other) const
{
// I'm needed by gtest
return id == other.id && sector == other.sector;
}
};
namespace std {
template <>
struct less<custom_key> {
bool operator()(const custom_key& lhs, const custom_key& rhs) const
{
return lhs.id < rhs.id;
}
};
}
TEST(MapValidation, 67704150)
{
map<custom_key, string> my_map { { { "id", "name" }, "expected_value" } };
EXPECT_THAT(my_map, Contains(Pair(custom_key { "id", "name" }, "expected_value")));
}
我也不明白你为什么需要匹配器。
我已经为我的地图编写了自定义键
struct custom_key {
string id;
string sector;
bool operator==(const custom_key& other) {
// I'm needed by gtest
return id == other.id && sector == other.sector;
}
};
我添加了 less then overload
namespace std
{
template<> struct less<custom_key>
{
bool operator() (const custom_key& lhs, const custom_key& rhs) const
{
return lhs.id < rhs.id;
}
};
}
我也定义了匹配器
MATCHER_P(match_eq, value, "")
{
return arg == value;
}
我试着写了一个测试
EXPECT_CALL(
*stats_,
stats(
AllOf(
Field(&data,
Contains(
Pair(
custom_key{"id", "name"},
match_eq("expected_value")
)
)
)
)
);
我运行反对
std::map<custom_key, std::string> my_map = { {"id", "name"}, "expected_value" }
gtest 说他没有找到匹配项。我迷路了。 由于在 gtest 的实现中广泛使用模板,我找不到调试它的任何帮助。 任何想法将不胜感激。
我在这里看到的第一个问题是您的 operator==
没有 const
限定符。你需要这样的东西:
bool operator==(const custom_key& other) const {
// I'm needed by gtest
return id == other.id && sector == other.sector;
}
下一个,
I've run it against std::map<custom_key, std::string> my_map = { {"id", "name"}, "expected_value" }
这不会编译,你需要额外的大括号来初始化 std::pair<custom_key, std::string>
之后会初始化 std::map
。
您没有解释您在 EXPECT_CALL 中执行的所有检查,但看起来您对使用 Contains.
进行容器验证有了大致的了解std::map 验证的完整解决方案如下所示:
#include <map>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace ::testing;
using namespace std;
struct custom_key {
string id;
string sector;
bool operator==(const custom_key& other) const
{
// I'm needed by gtest
return id == other.id && sector == other.sector;
}
};
namespace std {
template <>
struct less<custom_key> {
bool operator()(const custom_key& lhs, const custom_key& rhs) const
{
return lhs.id < rhs.id;
}
};
}
TEST(MapValidation, 67704150)
{
map<custom_key, string> my_map { { { "id", "name" }, "expected_value" } };
EXPECT_THAT(my_map, Contains(Pair(custom_key { "id", "name" }, "expected_value")));
}
我也不明白你为什么需要匹配器。