Gmock - 具有两个以上变量的匹配结构
Gmock - matching structures with more than two vairables
与 Gmock - matching structures 中的问题不同,我想知道如何为具有 >2 个成员的结构创建匹配器。假设我有一个包含 8 个成员的结构,并且 MyFun() 将指向 SomeStruct_t 的指针作为参数。
typedef struct
{
int data_1;
int data_2;
int data_3;
int data_4;
int data_5;
int data_6;
int data_7;
int data_8;
} SomeStruct_t;
SomeStruct_t my_struct;
EXPECT_CALL(*myMock, MyFun(MyMatcher(my_struct)));
关于 MyMatcher 应该如何实施,您有什么 suggestions/examples 吗?或者,我可以在不使用匹配器的情况下解决这个问题吗?我想检查 my_struct.
的每个元素
MATCHER_P(MyMatcher, MyStruct, "arg struct does not match expected struct")
{
return (arg.data_1 == MyStruct.data_1) && (arg.data_2 == MyStruct.data_2) &&
(arg.data_3 == MyStruct.data_3) && (arg.data_4 == MyStruct.data_4) &&
(arg.data_5 == MyStruct.data_5) && (arg.data_6 == MyStruct.data_6) &&
(arg.data_7 == MyStruct.data_7) && (arg.data_8 == MyStruct.data_8);
}
这解决了我的问题。虽然在 gmock 文档中有更多示例会很好。
你自己的答案没问题,但还有更好的方法。最好提供流运算符或 PrintTo
函数以提高 gtest 日志的可读性。
并且可以在失败的情况下强制 GTest 为匹配器打印更好的消息。
using testing::AllOf;
using testing::ExplainMatchResult;
using testing::Field;
using testing::Not;
std::ostream& operator<<(std::ostream& out, const SomeStruct_t& data)
{
return out << '{'
<< data.data_1 << ','
<< data.data_2 << ','
<< data.data_3 << ','
<< data.data_4 << ','
<< data.data_5 << ','
<< data.data_6 << ','
<< data.data_7 << ','
<< data.data_8 << '}';
}
MATCHER_P(MyMatcher, myStruct, "")
{
return ExplainMatchResult(
AllOf(Field("data_1", &SomeStruct_t::data_1, myStruct.data_1),
Field("data_2", &SomeStruct_t::data_2, myStruct.data_2),
Field("data_3", &SomeStruct_t::data_3, myStruct.data_3),
Field("data_4", &SomeStruct_t::data_4, myStruct.data_4),
Field("data_5", &SomeStruct_t::data_5, myStruct.data_5),
Field("data_6", &SomeStruct_t::data_6, myStruct.data_6),
Field("data_7", &SomeStruct_t::data_7, myStruct.data_7),
Field("data_8", &SomeStruct_t::data_8, myStruct.data_8)),
arg, result_listener);
}
这种小东西在测试发现问题的时候会付出很多。
与 Gmock - matching structures 中的问题不同,我想知道如何为具有 >2 个成员的结构创建匹配器。假设我有一个包含 8 个成员的结构,并且 MyFun() 将指向 SomeStruct_t 的指针作为参数。
typedef struct
{
int data_1;
int data_2;
int data_3;
int data_4;
int data_5;
int data_6;
int data_7;
int data_8;
} SomeStruct_t;
SomeStruct_t my_struct;
EXPECT_CALL(*myMock, MyFun(MyMatcher(my_struct)));
关于 MyMatcher 应该如何实施,您有什么 suggestions/examples 吗?或者,我可以在不使用匹配器的情况下解决这个问题吗?我想检查 my_struct.
的每个元素MATCHER_P(MyMatcher, MyStruct, "arg struct does not match expected struct")
{
return (arg.data_1 == MyStruct.data_1) && (arg.data_2 == MyStruct.data_2) &&
(arg.data_3 == MyStruct.data_3) && (arg.data_4 == MyStruct.data_4) &&
(arg.data_5 == MyStruct.data_5) && (arg.data_6 == MyStruct.data_6) &&
(arg.data_7 == MyStruct.data_7) && (arg.data_8 == MyStruct.data_8);
}
这解决了我的问题。虽然在 gmock 文档中有更多示例会很好。
你自己的答案没问题,但还有更好的方法。最好提供流运算符或 PrintTo
函数以提高 gtest 日志的可读性。
并且可以在失败的情况下强制 GTest 为匹配器打印更好的消息。
using testing::AllOf;
using testing::ExplainMatchResult;
using testing::Field;
using testing::Not;
std::ostream& operator<<(std::ostream& out, const SomeStruct_t& data)
{
return out << '{'
<< data.data_1 << ','
<< data.data_2 << ','
<< data.data_3 << ','
<< data.data_4 << ','
<< data.data_5 << ','
<< data.data_6 << ','
<< data.data_7 << ','
<< data.data_8 << '}';
}
MATCHER_P(MyMatcher, myStruct, "")
{
return ExplainMatchResult(
AllOf(Field("data_1", &SomeStruct_t::data_1, myStruct.data_1),
Field("data_2", &SomeStruct_t::data_2, myStruct.data_2),
Field("data_3", &SomeStruct_t::data_3, myStruct.data_3),
Field("data_4", &SomeStruct_t::data_4, myStruct.data_4),
Field("data_5", &SomeStruct_t::data_5, myStruct.data_5),
Field("data_6", &SomeStruct_t::data_6, myStruct.data_6),
Field("data_7", &SomeStruct_t::data_7, myStruct.data_7),
Field("data_8", &SomeStruct_t::data_8, myStruct.data_8)),
arg, result_listener);
}
这种小东西在测试发现问题的时候会付出很多。