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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top