在Google Test失败输出消息中自定义实际/预期的“Value of”字符串

时间:2013-03-03 21:17:21

标签: c++ googletest

我有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的参数宏。

2 个答案:

答案 0 :(得分:9)

gtest-printers.h源文件中的标题提供了答案:

  

此文件实现了一个通用值打印机,可以打印任何类型的值T:

     

void :: testing :: internal :: UniversalPrinter :: Print(value,ostream_ptr);

     

用户可以通过在定义T的名称空间中定义运算符&lt;&lt;()或PrintTo()来教授此函数如何打印类类型T.更具体地说,将使用以下列表中的FIRST定义函数(假设T在名称空间foo中定义):

     
      
  1. foo :: PrintTo(const T&amp;,ostream *)
  2.   
  3. 运算符&lt;(&lt;(ostream&amp;,const T&amp;)在foo或全局命名空间中定义。
  4.         

    如果没有定义上述任何一项,如果它是协议缓冲区,它将打印该值的调试字符串,否则打印该值中的原始字节。

所以看起来操作符覆盖需要是非成员函数。

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部分所述。