如何解决Google测试框架不打印std :: optional
我有一个数据结构,该结构将通知给侦听器。在它的许多变量中,它有一个可选的double表示角度:
struct Data
{
// ...other data fields
std::optional<double> angle;
// ...other data fields
};
我想检查是否使用正确的angle
调用了侦听器。我正在使用 Google测试框架,所以我在这里定义了自己的匹配器:
MATCHER_P( HasAngle,angle,"" )
{
if ( !arg.angle.has_value( ) )
{
return false;
}
return arg.angle.value( ) == angle;
}
并检查是否正在以期望的值调用我的侦听器。
EXPECT_CALL( listener,on_event( HasAngle( 45.0 ) ) ).Times( AtLeast( 1 ) );
最终,未使用预期值调用侦听器,但打印输出确实不可读:
Expected arg #0: has angle 45
Actual: 128-byte object <75-85 4D-52 FB-21 F9-BF 47-D9 48-53 FB-21 09-C0 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 01-17 23-83 FD-7F 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00>
实际值难以理解。我不希望该框架默认情况下不支持C ++ 17类型,所以我开始阅读 Google测试框架指南,然后尝试添加自己的PrintTo
重载,如下所示:
void
PrintTo( const std::optional< double >& opt,std::ostream* os )
{
if ( !opt )
{
*os << "std::nullopt";
}
else
{
*os << *opt;
}
}
不用说,它没有帮助。我几乎可以确定的是,由于输出状态为128-byte object
,因此它尝试打印的是唯一的std::optional<double>
而不是整个struct Data
,但比整个要大得多,但不是尽管PrintTo
过载,但还是成功。
解决方法
您担心类型错误。您的master
是要测试的结果,而不是dev
。这就是您的代码包含struct Data
的原因,因为std::optional<double>
是arg.angle
。为arg
定义一个流插入运算符,然后gtest将使用它。
在测试中为您的类型定义标准输出运算符应该会有所帮助,并在gmock错误消息中使用
template <class T>
std::ostream & operator<<(std::ostream & os,std::optional<T> const & opt)
{
if (opt) return os << opt.value();
return os << "EMPTY";
}
,
您的尝试无效,因为它是std::
类型。您必须根据documentation
std
命名空间中定义PrintTo
//如果您不能在类中声明该函数,则重要的是 PrintTo()//在定义Bar的SAME命名空间中定义。 C ++的 查找规则依赖//。
因此,我希望以下各项可以工作(如果包含在Google测试框架之前):
namespace std {
void
PrintTo( const optional< double >& opt,std::ostream* os )
{
if ( !opt )
{
*os << "std::nullopt";
}
else
{
*os << *opt;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。