c++ - traduccion - traducir
¿Cómo hacer que las clases de google-test sean amigas con mis clases? (3)
Escuché que existe la posibilidad de habilitar las clases de Google TestCase en mis clases, lo que permite que las pruebas accedan a mis miembros privados / protegidos.
¿Cómo lograr eso?
Prueba esto (directamente de Google Test Docs ...):
FRIEND_TEST(TestCaseName, TestName);
Por ejemplo:
// foo.h
#include <gtest/gtest_prod.h>
// Defines FRIEND_TEST.
class Foo {
...
private:
FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
int Bar(void* x);
};
// foo_test.cc
...
TEST(FooTest, BarReturnsZeroOnNull) {
Foo foo;
EXPECT_EQ(0, foo.Bar(NULL));
// Uses Foo''s private member Bar().
}
Sé que esto es viejo pero hoy estaba buscando la misma respuesta. "gtest_prod.h" simplemente introduce una macro simple para hacer referencia a las clases de prueba.
#define FRIEND_TEST(test_case_name, test_name)/
friend class test_case_name##_##test_name##_Test
Así que FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
es equivalente a:
friend class FooTest_BarReturnsZeroOnNull_Test;
Esto funciona porque cada prueba es su propia clase como se mencionó en la respuesta anterior.
Una estrategia mucho mejor es no permitir pruebas de amigos entre las pruebas de unidad.
Permitir que las pruebas de amigos accedan a miembros privados dará lugar a una base de códigos que es difícil de mantener. Las pruebas que se rompen cada vez que se refaccionan los detalles internos de la implementación de un componente no es lo que desea. Si en su lugar se pone un esfuerzo adicional para obtener un diseño en el que los componentes puedan probarse a través de su interfaz pública, obtendrá pruebas que solo necesitan actualizarse cada vez que se actualice la interfaz pública de un componente.
Las pruebas que se basan en gtest/gtest_prod.h
deben verse como un signo de diseño deficiente.