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
};
}
Przepraszam: zajęcia są zdefiniowane w bibliotece dll i używasz ich, ale definiują metody drukowania w twojej aplikacji? –
Tak. Cóż, nie w ostatecznej aplikacji. W teście cpp. Czy to nie powinno działać? – MikMik
To może być problem z rozpoznawaniem nazw, nie jestem pewien, czy to jest szczere. –