2010-03-07 2 views

Répondre

26

Essayez ceci (directement à partir de Google docs test ...):

FRIEND_TEST(TestCaseName, TestName); 

Par exemple:

// 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

Que se passe-t-il si j'ai un autre test par exemple BarReturnsOneOnSth. Dois-je ajouter une autre déclaration FRIEND_TEST pour ce test également? – pajton

+1

Oui. Chaque test est techniquement une classe, et vous devez vous lier d'amitié un à la fois. – hobbit

+15

Comment puis-je le faire d'une manière qui ne me force pas à inclure des fichiers d'en-tête googletest dans le fichier d'en-tête avec la classe 'Foo'? –

19

Je sais que c'est vieux, mais je cherchais la même réponse aujourd'hui. "gtest_prod.h" introduit simplement une macro simple pour référencer les classes de test.

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

Alors FRIEND_TEST(FooTest, BarReturnsZeroOnNull); équivaut à:

friend class FooTest_BarReturnsZeroOnNull_Test; 

Cela fonctionne parce que chaque test est sa propre classe comme mentionné dans la réponse précédente.

+0

@DaveRuske Veuillez ne pas expliquer votre modification dans le montage lui-même. C'est ce que le résumé d'édition est pour. Si le problème est la limite de 6 caractères, vous pouvez ajouter un '' quelque part dans le corps ('' est un commentaire et ne sera donc pas visible). –

0

Une meilleure stratégie consiste à ne pas autoriser les tests d'amis parmi vos tests unitaires.

Autoriser les tests d'ami à accéder à des membres privés conduira à une base de code difficile à maintenir. Les tests qui interrompent chaque fois que les détails d'implémentation internes d'un composant sont refacturés ne sont pas ce que vous voulez. Si des efforts supplémentaires sont faits pour obtenir un design où les composants peuvent être testés via leur interface publique, vous obtiendrez des tests qui n'ont besoin d'être mis à jour que lorsque l'interface publique d'un composant est mise à jour.

Les tests reposant sur gtest/gtest_prod.h doivent être considérés comme un signe de mauvaise conception.

+1

Je comprends que c'est controversé (j'espère qu'il vous a valu une sorte de "réponse controversée" badge ), mais je suis heureux que quelqu'un a soulevé ce point de vue. Beaucoup sont d'accord avec @Martin à ce sujet! https://dzone.com/articles/principles-creating – pestophagous