2013-03-03 6 views
5

Mam następujący wynik z testu Google Test jednostkowej:Dostosuj faktyczne/oczekiwany „wartość” w ciąg komunikatów wyjściowych Usterka 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) 

To szesnastkowy ciąg wyjściowy nie jest bardzo przydatna. Czy jest coś, co mogę dodać do klasy Line (dla której test równości nie działa), aby zapewnić bardziej przydatne błędy w takich przypadkach?

danej klasy jest przesłonięta operatora << jako funkcji członka:

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

Widać, że to działa na linii „Oczekiwano”, ale nie wiersz „rzeczywisty”. To stwierdzenie jest nieprawdziwe — przedstawiony test pochodzi z parametru makro TEST.

Odpowiedz

6

Aby drukować niestandardowe typy można „nauczyć” Test Google sposób drukowania typy niestandardowe, które zgodnie z opisem w sekcji „Nauczanie test Google Jak wydrukować swoje wartości” here

7

Nagłówek w pliku źródłowym gtest-printers.h daje odpowiedź:

Plik ten implementuje wartość drukarki uniwersalne, które można wydrukować wartość dowolnego typu T:

void :: badania :: wewnętrzny: : UniversalPrinter :: Print (wartość, ostream_ptr);

Użytkownik może nauczyć tę funkcję drukowania klasy typu T, definiując operatora < <() lub PrintTo() w przestrzeni nazw, która definiuje T. Dokładniej, pierwsza zdefiniowana funkcja z poniższej listy zostanie użyta (zakładając, że T jest zdefiniowane w przestrzeni nazw foo):

  1. foo :: PrintTo (const T &, ostream *)
  2. operator < < (ostream &, const T &) zdefiniowany w dowolnym foo lub globalnej przestrzeni nazw .

Jeśli żadna z powyższych nie zostanie zdefiniowana, wypisze ciąg debugowania wartości, jeśli jest to bufor protokołu, lub wydrukuje surowe bajty w innej wartości.

Wygląda na to, że nadpisanie operatora musi być funkcją bez funkcji.

std::ostream& operator<<(std::ostream& stream, Line const& line) 
{ 
    return stream << "Line (radius=" << line.radius() << " theta=" << line.theta() << ")"; 
}