2011-01-05 3 views
1

Quel serait un bon motif de conception si je devais tester une classe A de C++ qui s'interface avec la classe B où les appels de B initieraient des rappels à A plus tard?
J'ai besoin d'un contrôle complet sur ces rappels - quand ils sont exécutés et avec quelles informations. J'utilise Google Test et Google Mock comme cadres de test. Dans l'intro de Google Mock, ils expliquent le difference between a fake and a mock. Il semble que j'aie besoin d'une fausse classe B et non d'un faux.
Dans leurs documents ils détaillent la façon d'avoir non-trivial implementations of B's functions, mais cela ne résout pas mon exigence de contrôle des callbacks de B à A.C++ Fake class avec callbacks

MISES À JOUR:

  • Juste pour clarifier: A a les callbacks. Quelque temps après que A appelle les fonctions de B, B initie les fonctions de rappel dans A. Bien que cela n'ait pas d'importance, dans mon cas B détient un pointeur sur A et appelle une fonction d'interface prédéfinie (dérivée d'une classe virtuelle pure A_abstract).

Répondre

2

class A ne devrait pas être concerné si les appels de rappel sont faites par B ou par un code complètement différent, comme Tant que toutes les informations fournies dans le rappel sont correctes. Cela signifie que, si votre boîtier de test peut obtenir toutes les informations nécessaires au rappel, vous pouvez appeler le rappel depuis le script de test au moment approprié et utiliser un simulacre pour class B.


Si class A vérifie en fait que les callbacks sont effectuées par class B (dans la mesure qui peut réellement être atteint), puis les classes A et B sont trop serré pour les tester séparément. Ensuite, vous devriez repenser si elles devraient vraiment être deux classes étroitement couplées.

+0

Vous êtes la première moitié semble être la solution, j'ai encore besoin de le tester. Pour une raison quelconque, j'étais bloqué sur l'idée que B doit déclencher A. Au moins dans mon cas, cela n'a pas vraiment d'importance si B ou le script de test appelle les callbacks de A. – Jonathan

+0

C'est comme ça que ça devrait toujours être. Et rappelez-vous simplement que les simulacres ne doivent pas resénuer le code réel, tant que le code sous test ne peut pas remarquer ou ne se soucie pas de la différence. –

0

Je ne sais pas si j'ai bien compris votre question, mais il semble que ce que vous désirez est the strategy pattern. Vous pouvez obtenir callbacks de B à A aussi longtemps que vous avez un pointeur A_abstract comme une variable de membre B.

class A_abstract { 

public: 
    virtual void work() = 0; 
}; 

class B { 

private: 
    A_abstract* _m_A_ptr; 

public: 
    set_a_ptr(A_abstract* _APtr) { _m_A_ptr = _APtr; } 

    void work() { _m_A_ptr->work(); } 
}; 
0

Avez-vous envisagé d'utiliser les signaux et emplacements de Qt (ou de quelqu'un d'autre)? J'aime raisonner sur les signaux et les slots bien plus que les callbacks, même si (je pense) ils sont fondamentalement équivalents en fonctionnalités.

-Brian-

+0

Rien de mal avec les rappels, mais le signal QT et les slots ont des fonctionnalités différentes. Ils sont très similaires au modèle Publisher/Subscriber., Mais peu pire en raison de la façon dont QT enregistre les rappels. –