2010-03-07 16 views

Odpowiedz

26

Spróbuj tego (prosto od Google docs testowych ...):

FRIEND_TEST(TestCaseName, TestName); 

Na przykład:

// 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(). 
} 
+0

Co jeśli mam inny test, na przykład BarReturnsOneOnSth. Czy muszę też dodać inną deklarację FRIEND_TEST dla tego testu? – pajton

+1

Tak. Każdy test jest technicznie klasą i musisz zaprzyjaźnić się z nimi po jednym na raz. – hobbit

+15

Jak mogę to zrobić w sposób, który nie zmusza mnie do dołączenia plików nagłówkowych googletest do pliku nagłówkowego z klasą 'Foo'? –

19

wiem, że to jest stary, ale szukałem tej samej odpowiedzi dziś. "gtest_prod.h" po prostu wprowadza proste makro do odwoływania się do klas testowych.

#define FRIEND_TEST(test_case_name, test_name)\ 
friend class test_case_name##_##test_name##_Test 

Więc FRIEND_TEST(FooTest, BarReturnsZeroOnNull); odpowiada:

friend class FooTest_BarReturnsZeroOnNull_Test; 

To działa, ponieważ każda próba jest jego własna klasa jak wspomniano w poprzedniej odpowiedzi.

+0

@DaveRuske Proszę nie wyjaśniać swojej edycji w samej edycji. Po to właśnie jest podsumowanie edycji. Jeśli problem dotyczy limitu 6 znaków, możesz dodać '' gdzieś w ciele ('' jest komentarzem i dlatego nie będzie widoczne). –

0

O wiele lepszą strategią jest niedopuszczanie testów znajomych podczas testów jednostkowych.

Pozwolenie na testowanie znajomych w celu dostępu do prywatnych członków doprowadzi do bazy kodu, która jest trudna do utrzymania. Testy, które łamią się, gdy wewnętrzne szczegóły implementacji komponentu są refaktoryzowane, nie są tym, czego potrzebujesz. Jeśli zamiast tego zostanie podjęty dodatkowy wysiłek, aby uzyskać projekt, w którym można przetestować komponenty za pomocą interfejsu publicznego, otrzymasz testy, które będą wymagać aktualizacji tylko po zaktualizowaniu interfejsu publicznego komponentu.

Testy polegające na gtest/gtest_prod.h powinny być postrzegane jako oznaka złego projektu.

+1

Rozumiem, że jest to kontrowersyjne (miejmy nadzieję, że przyniosło ci to pewnego rodzaju "kontrowersyjną odpowiedź" odznakę ), ale cieszę się, że ktoś poruszył ten punkt widzenia. Wielu zgadza się z @Martin na ten temat! https://dzone.com/articles/principles-creating – pestophagous