15

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)

その 16 進数の出力文字列はあまり役に立ちません。Lineそのような場合により役立つエラーを提供するために、(等値テストが失敗している) クラスに追加できるものはありますか?

問題のクラスは、<<演算子をメンバー関数としてオーバーライドしています。

std::ostream& operator<<(std::ostream& stream) const
{
  return stream << "Line (radius=" << d_radius << " theta=" << d_theta << ")";
}

これは「Expected」行では機能しますが、「Actual」行では機能しないことがわかります。このステートメントは正しくありません。示されているテストは、TESTマクロのパラメーターから取得されます。

4

3 に答える 3

14

カスタムタイプを印刷するには、「Google Testに値を印刷する方法」のセクションで説明されているように、カスタムタイプを印刷する方法をGoogleTestに「教える」ことができます。

于 2013-03-03T21:28:06.343 に答える
10

ソースファイルのヘッダーはgtest-printers.h答えを提供します:

このファイルは、任意のタイプTの値を印刷できるユニバーサルバリュープリンターを実装しています。

void :: tests :: internal :: UniversalPrinter :: Print(value、ostream_ptr);

ユーザーは、Tを定義する名前空間でoperator <<()またはPrintTo()のいずれかを定義することにより、この関数にクラスタイプTを出力する方法を教えることができます。より具体的には、次のリストで最初に定義された関数が使用されます(Tが名前空間fooで定義):

  1. foo :: PrintTo(const T&、ostream *)
  2. fooまたはグローバル名前空間のいずれかで定義されたoperator<<(ostream&、const T&)。

上記のいずれも定義されていない場合、プロトコルバッファの場合は値のデバッグ文字列を出力し、それ以外の場合は値の生のバイトを出力します。

したがって、演算子のオーバーライドは非メンバー関数である必要があるようです。

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