2014-07-10 7 views
6

Mam dość dziwny problem z informacją, aby googletest wydrukował określoną klasę tak, jak chcę, używając PrintTo.
Klasa jest bardzo prostym punktem 2D, znajduje się w przestrzeni nazw, a funkcja PrintTo znajduje się w tej samej przestrzeni nazw. W rzeczywistości mam klasę pochodną (punkt 3D), która doskonale drukuje.GoogleTest DrukujNie otrzymuję wezwanie do klasy

Oto niektóre kodu do testów i funkcji PrintTo (nazwa przestrzeni nazw edytowanych, ale wszystko inne jest kopiowany i wklejany od rzeczywistego kodu):

// PrintTo Functions 
namespace MyNamespace 
{ 
    void PrintTo(const MyNamespace::CPunto2D& pto, ::std::ostream* os) 
    { 
     *os << "("; 
     *os << pto.X(); 
     *os << ","; 
     *os << pto.Y(); 
     *os << ")"; 
    } 

    void PrintTo(const MyNamespace::CPunto3D& pto, ::std::ostream* os) 
    { 
     *os << "("; 
     *os << pto.X(); 
     *os << ","; 
     *os << pto.Y(); 
     *os << ","; 
     *os << pto.m_Z; 
     *os << ")"; 
    } 
} 

// Tests 
TEST(TestPrintTo, TestPunto2D) 
{ 
    MyNamespace::CPunto2D p1(1,1); 
    MyNamespace::CPunto2D pRef(5,6); 

    ASSERT_THAT(p1, Eq(pRef)); 
} 

TEST(TestPrintTo, TestPunto3D) 
{ 
    MyNamespace::CPunto3D pCentro(1,1,1); 
    MyNamespace::CPunto3D pRef(5,6,7); 

    ASSERT_THAT(pCentro, Eq(pRef)); 
} 

// Output 
[ RUN  ] TestPrintTo.TestPunto2D 
.\TestPuntoEje.cpp(82): error: Value of: p1 
Expected: is equal to 16-byte object <00-00 00-00 00-00 14-40 00-00 00-00 00-00 18-40> 
    Actual: 16-byte object <00-00 00-00 00-00 F0-3F 00-00 00-00 00-00 F0-3F> (of type class MyNamespace::CPunto2D) 
[ FAILED ] TestPrintTo.TestPunto2D (1 ms) 
[ RUN  ] TestPrintTo.TestPunto3D 
.\TestPuntoEje.cpp(90): error: Value of: pCentro 
Expected: is equal to (5,6,7) 
    Actual: (1,1,1) (of type class MyNamespace::CPunto3D) 
[ FAILED ] TestPrintTo.TestPunto3D (0 ms) 

Próbowałem powtórzyć ten problem w prosty test projekt, ale tam drukuje doskonale. Jedyną różnicą, jaką mogę odnieść między projektem testowym a rzeczywistym jest to, że w klasach CPunto2D i CPunto3D są w bibliotece dll, oczywiście z większą ilością klas i zależą od biblioteki.

Każdy pomysł na to, dlaczego nie wybiera funkcji PrintTo?

Używam Visual Studio 2008 i googletest 1,7

Uwaga: Chociaż przykład używa ASSERT_THAT GMock za, próbowałem go ASSERT_EQ i to samo.

UPDATE:

Oto deklaracje CPunto2D i CPunto3D. CLAS_DEC to tylko makro do importowania/eksportowania z biblioteki dll. Wiem, że w klasach jest coś złego, na przykład członkowie publiczni i tacy, więc proszę nie wskazywać tych rzeczy, jeśli nie są one istotne dla danego problemu.

namespace MyNamespace 
{ 
    class CLAS_DEC CPunto2D 
    { 
    public: 
     double m_X; 
     double X() const { return m_X; } 
     void X(double val) { m_X = val; } 
     double m_Y; 
     double Y() const { return m_Y; } 
     void Y(double val) { m_Y = val; } 
     //Constructores/Destructores 
     CPunto2D(); 
     CPunto2D(double X, double Y); 
     CPunto2D(const CPunto2D& P); 
     ~CPunto2D(); 

     CPunto2D& Set(double X, double Y); 

     //Operadores 
     CPunto2D& operator =(const CPunto2D& P); 

     //Funciones extra 
     double Distancia (const CPunto2D& P) const; //Distancia a otro punto 
    }; 
    bool CLAS_DEC operator==(const CPunto2D& lhs, const CPunto2D& rhs); 
    bool CLAS_DEC operator!=(const CPunto2D& lhs, const CPunto2D& rhs); 
} 

namespace MyNamespace 
{ 
    class CLAS_DEC CPunto3D : public CPunto2D 
    { 
    public: 
     double m_Z; 

     // Constructores/Destructores 
     CPunto3D(); 
     CPunto3D(double X, double Y, double Z); 
     CPunto3D(const CPunto3D& P); 
     CPunto3D(const CPunto2D& P); 
     ~CPunto3D(); 

     CPunto3D& Set(double X, double Y, double Z); 

     // Operadores 
     CPunto3D& operator =(const CPunto3D& P); 
     bool operator==(const CPunto3D& P) const; 
     bool operator!=(const CPunto3D& P) const; 

     // Funciones Extra 
     double Distancia (const CPunto3D& P) const; //Distancia a otro punto 
     double Distancia2D (const CPunto2D& P) const; //Distancia en el plano a otro punto 
    }; 
} 
+0

Przepraszam: zajęcia są zdefiniowane w bibliotece dll i używasz ich, ale definiują metody drukowania w twojej aplikacji? –

+0

Tak. Cóż, nie w ostatecznej aplikacji. W teście cpp. Czy to nie powinno działać? – MikMik

+0

To może być problem z rozpoznawaniem nazw, nie jestem pewien, czy to jest szczere. –

Odpowiedz

6

problemów jest to, że przerwania O ne D EFINICJA R ule (ODR) jednej funkcji numeru GTEST (prawdopodobnie template ::testing::PrintToString<MyNamespace::CPunto2D>(const MyNamespace::CPunto2D&)).

W jednym TU gdzie można wykorzystać ASSERT_EQ, void PrintTo(const MyNamespace::CPunto2D& pto, ::std::ostream* os) nie jest zadeklarowana, tak ::testing::PrintToString<MyNamespace::CPunto2D> wykorzystuje drukarkę domyślną.

W innym TU gdzie można wykorzystać ASSERT_EQ masz void PrintTo(const MyNamespace::CPunto2D& pto, ::std::ostream* os) zadeklarowana (i potencjalnie zdefiniowane), więc ::testing::PrintToString<MyNamespace::CPunto2D> używa wersji przy użyciu niestandardowego PrintTo.

To jest inna druga inna definicja tej samej funkcji.

Musisz upewnić się, że każda JT, która używa ASSERT_EQ, zobacz deklarację niestandardowego PrintTo (jak w nagłówku CPunto2D).

Powiązane problemy