15

我有来自Google 测试单元测试的以下输出:

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 << ")";
}

您可以看到这适用于“预期”行,但不适用于“实际”行。这种说法是不正确的——显示的测试来自TEST宏的参数。

4

3 回答 3

14

为了打印自定义类型,您可以“教”Google Test 如何打印您的自定义类型,如教 Google 测试如何打印您的值一节中所述。

于 2013-03-03T21:28:06.343 回答
10

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

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

无效 ::testing::internal::UniversalPrinter::Print(value, ostream_ptr);

用户可以通过在定义 T 的命名空间中定义 operator<<() 或 PrintTo() 来教该函数如何打印类类型 T。更具体地说,将使用以下列表中第一个定义的函数(假设 T 是在命名空间 foo 中定义):

  1. foo::PrintTo(const T&, ostream*)
  2. operator<<(ostream&, const T&) 在 foo 或全局命名空间中定义。

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

所以看起来运算符覆盖需要是一个非成员函数。

std::ostream& operator<<(std::ostream& stream, Line const& line)
{
  return stream << "Line (radius=" << line.radius() << " theta=" << line.theta() << ")";
}
于 2013-03-03T21:28:01.313 回答
0

在某些情况下,提供PrintTo()函数而不是流运算符可能会更好。例如,如果您想自定义容器(具有begin()/ end())的打印方式,Google Test 的现有内部运算符当前将优先于自定义运算符。在这种情况下,您的操作员将无法工作,但PrintTo()功能会。定义如下所示:

void PrintTo(const Range& range, ::std::ostream* os)
{
   *os << range;
}

另见此处:https ://github.com/google/googletest/issues/3458

于 2021-08-14T20:47:10.973 回答