2013-03-03 7 views
5

ho il seguente output da un test Google Test unità:Personalizza effettivo previsto "Valore" stringa/nei messaggi in uscita Google prova di guasto

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) 

quella stringa esadecimale di uscita non è molto utile. C'è qualcosa che posso aggiungere alla classe Line (per la quale un test di uguaglianza non riesce) per fornire errori più utili in questi casi?

La classe in questione ha ignorato l'operatore << come una funzione membro:

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

Si può vedere che questo funziona per la linea 'Previsto', ma non la linea 'Actual'. Questa affermazione non è vera — il test mostrato proviene dal parametro della macro TEST.

risposta

6

Per stampare i tipi personalizzati è possibile "insegnare" Google prova come stampare i tipi personalizzati che, come descritti nella sezione "Insegnare Google prova come stampare i valori" here

7

L'intestazione del file di origine gtest-printers.h fornisce una risposta:

Questo file implementa una stampante valore universale che può stampare un valore di qualsiasi tipo T:

vuoto :: :: test interno: : UniversalPrinter :: Stampa (valore, ostream_ptr);

Un utente può insegnare a questa funzione come stampare un tipo di classe T definendo l'operatore < <() o PrintTo() nello spazio dei nomi che definisce T. Più in particolare, verrà utilizzata la funzione PRIMA definita nell'elenco seguente. (supponendo T è definito nel namespace foo):

  1. foo :: PrintTo (const T &, ostream *)
  2. operatore < < (ostream &, const T &) definita sia foo o namespace globale .

Se nessuno dei precedenti è definito, stamperà la stringa di debug del valore se si tratta di un buffer di protocollo o stamperà i byte non elaborati nel valore altrimenti.

Quindi sembra che l'override dell'operatore debba essere una funzione non membro.

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