【问题标题】:Gmock - matching structures with more than two vairablesGmock - 匹配具有两个以上变量的结构
【发布时间】:2021-11-17 00:11:48
【问题描述】:

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 有任何建议/示例吗?或者,我可以在不使用匹配器的情况下解决这个问题吗?我想检查 my_struct 的每个元素。

【问题讨论】:

  • 您在调整您链接的问题的答案时遇到了什么麻烦?为其他字段添加更多检查似乎很简单。
  • 我不知道如何调整这些答案,因此我提出了问题。
  • 只为my_struct提供相等的运算符。

标签: c++ struct googletest matcher gmock


【解决方案1】:

您自己的答案还可以,但有更好的方法。最好提供流操作符或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);
}

当测试发现一些问题时,这种微不足道的代价。

Live demo

【讨论】:

    【解决方案2】:
    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 文档中提供更多示例会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多