我有Google Test单元测试的以下输出:
UnitTests.cc:56: Failure
Value of: LineSegment2i(Vector2i(-10,0), Vector2i(-10,10)).toLine()
Actual: 24-byte object <00-00 00-00 00-00 24-C0 00-00 00-00 00-00 00-00 00-00 2F-2B FF-7F 00-00>
Expected: Line(10, 3.14159265358979323846)
Which is: 24-byte object <00-00 00-00 00-00 24-40 18-2D 44-54 FB-21 09-40 00-00 64-00 00-00 00-00>
[ FAILED ] LineSegmentTests.toLine (1 ms)
那个十六进制输出字符串不是很有用。有什么东西我可以添加到Line
类(相等测试失败),以便在这种情况下提供更多有用的错误吗?
有问题的类已将<<
运算符重写为成员函数:
std::ostream& operator<<(std::ostream& stream) const
{
return stream << "Line (radius=" << d_radius << " theta=" << d_theta << ")";
}
您可以看到这适用于'Expected'行,但不适用于'Actual'行。此语句不真实 - 显示的测试来自TEST
的参数宏。
答案 0 :(得分:9)
gtest-printers.h
源文件中的标题提供了答案:
此文件实现了一个通用值打印机,可以打印任何类型的值T:
void :: testing :: internal :: UniversalPrinter :: Print(value,ostream_ptr);
用户可以通过在定义T的名称空间中定义运算符&lt;&lt;()或PrintTo()来教授此函数如何打印类类型T.更具体地说,将使用以下列表中的FIRST定义函数(假设T在名称空间foo中定义):
- foo :: PrintTo(const T&amp;,ostream *)
- 运算符&lt;(&lt;(ostream&amp;,const T&amp;)在foo或全局命名空间中定义。
醇>如果没有定义上述任何一项,如果它是协议缓冲区,它将打印该值的调试字符串,否则打印该值中的原始字节。
所以看起来操作符覆盖需要是非成员函数。
std::ostream& operator<<(std::ostream& stream, Line const& line)
{
return stream << "Line (radius=" << line.radius() << " theta=" << line.theta() << ")";
}
答案 1 :(得分:9)
为了打印自定义类型,您可以“教授”Google测试如何打印自定义类型,如Teaching Google Test How to Print Your Values部分所述。