2016-10-03 3 views
1

Ich kann angeben, wie der Inhalt eines Objekts angezeigt wird, wenn ein Test fehlgeschlagen ist. Um dies zu tun, definiere ich die Funktion PrintTo für die Klasse. Das Ergebnis ist, wie gewünscht (die Zeichenfolge MyObject as object):PrintTo für einen Zeiger in Google Test

x.cpp:17: Failure 
Value of: foo1 
Expected: has foo <MyObject as object> 
    Actual: <MyObject as object> (of type Foo) 

Leider kann ich nicht finden, wie man das gleiche für das Objekt für einen Zeiger zu tun. Anstelle der benutzerdefinierten Zeichenfolge MyObject as pointer Ich erhalte die Standard-Ausgabe:

x.cpp:22: Failure 
Value of: pfoo1 
Expected: has foo 0x8058330 
    Actual: 0x8058320 (of type Foo*) 

Als Abhilfe, die ich dereferenzieren den Zeiger kann, aber ich würde gerne wissen, ob es eine direkte Lösung, die PrintTo auf einem Zeiger zu überlasten ist .

#include <gmock/gmock.h> 

struct Foo { }; 

void PrintTo(const Foo& value, ::std::ostream* os) { 
    *os << "<MyObject as object>"; 
} 

void PrintTo(const Foo* value, ::std::ostream* os) { 
    *os << "<MyObject as pointer>"; 
} 

MATCHER_P(HasFoo, expected, "") { return false; } 

TEST(Foo, Object) { 
    Foo foo1, foo2; 
    ASSERT_THAT(foo1, HasFoo(foo2)); 
} 

TEST(Foo, Pointer) { 
    Foo *pfoo1 = new Foo(), *pfoo2 = new Foo(); 
    ASSERT_THAT(pfoo1, HasFoo(pfoo2)); 
} 

int main(int argc, char** argv) { 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 
+2

Haben Sie versucht, "void PrintTo (Foo * value, :: std :: ostream * os)" zu überladen? Das "const" könnte hier den Unterschied machen. – AndyG

+1

Oder vielleicht 'PrintTo (Foo * const Wert, :: std :: ostream * os)'? –

Antwort

1

Wie @AndyG vorgeschlagen und @ olaf-dietsche sollte die führende const entfernt werden. Diese Arbeit:

Foo* value

Foo* const value

Und das nicht:

const Foo* value

const Foo* const value

const Foo*& value