Come fare google-test classi di amici con la mia classe?
-
25-09-2019 - |
Domanda
Ho sentito che c'è la possibilità di attivare google-test TestCase classi di amici per le mie lezioni, consentendo di test per accedere a my private/protected membri.
Come realizzare questo?
Soluzione
Prova questo (direttamente dal Test di Google docs...):
FRIEND_TEST(TestCaseName, TestName);
Per esempio:
// 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().
}
Altri suggerimenti
So che questo è vecchio, ma stavo cercando la stessa risposta di oggi."gtest_prod.h" solo introduce una semplice macro di prova di riferimento classi.
#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test
Così FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
è equivalente a:
friend class FooTest_BarReturnsZeroOnNull_Test;
Questo funziona perché ogni test è la sua propria classe, come indicato nella risposta precedente.
Un gran lunga migliore strategia è quella di non consentire l'amico prove tra gli unit test.
Permettendo amico prove di accesso ai membri privati porterà ad una base di codice è difficile da gestire.I test che si rompono ogni volta che una componente interna di dettagli di implementazione sono refactoring non è ciò che si desidera.Se lo sforzo supplementare è invece messo in ricevendo un design in cui i componenti possono essere verificate tramite l'interfaccia pubblica, si otterrà prove che solo bisogno di un aggiornamento ogni volta che l'interfaccia pubblica di un componente viene aggiornato.
Prove di affidarsi a gtest/gtest_prod.h
dovrebbe essere visto come un segno di cattiva progettazione.
Quando il vostro testato classe e la classe di test sono in un namespace diverso (ad es.i tuoi test sono nello spazio dei nomi globale), è necessario inoltrare la dichiarazione di classe di test e di aggiungere il prefisso dello spazio dei nomi in FRIEND_TEST:
// foo.h
#include <gtest/gtest_prod.h>
class FooTest_BarReturnsZeroOnNull_Test;
// Defines FRIEND_TEST.
class my_namespace::Foo {
...
private:
FRIEND_TEST(::FooTest, BarReturnsZeroOnNull);
int Bar(void* x);
};
// foo_test.cc
using namespace my_namespace;
...
TEST(FooTest, BarReturnsZeroOnNull) {
Foo foo;
EXPECT_EQ(0, foo.Bar(NULL));
// Uses Foo's private member Bar().
}
So che l'amico gli unit test (o l'amicizia in C++ in generale) e white-box testing sono un argomento controverso, ma quando lavori sul complesso scientifico algoritmi, ogni passo che avete bisogno di testare e convalidare, ma che non si vuole esporre in pubblico (o anche protetti) interfacce, amico prove mi appaiono come un semplice e pragmatica soluzione, soprattutto in un test-driven development approccio.È sempre possibile per il refactoring del codice in un secondo momento (o per rimuovere completamente scatola bianca-test) se è contro la religione uso di amicizia o di white-box testing.