2011-08-23 2 views
3

les interfacesQuel est le moyen le plus simple d'invoquer une fonction membre sur un argument passé à une fonction mockée?

Compte tenu
class IFooable { 
    virtual void Fooable() = 0; 
}; 

class IFoo { 
    virtual void Foo(IFooable* pFooable) = 0; 
}; 

et la Goole maquette maquette

class TMockFoo : public IFoo { 
    MOCK_METHOD1(Foo, void (IFooable*)); 
}; 

ce qui est la meilleure façon de spécifier une action qui appelle Fooable() sur l'argument à la méthode moqué Foo()?

J'ai essayé

TMockFoo MockFoo; 
ON_CALL(MockFoo, Foo(_)) 
    .WithArg<0>(Invoke(&IFooable::Fooable)); 

mais cela ne compile pas parce Invoke() avec un argument attend une fonction libre, pas une fonction de membre.

L'utilisation de boost::bind devrait probablement fonctionner, mais ne rendra pas nécessairement le code trop lisible. Avant que j'écrive un Action personnalisé, j'ai voulu vérifier si je ne manque pas quelque chose de totalement évident.

+0

S'il vous plaît ne * simulacre * personne. Mauvaise habitude: P – Nawaz

Répondre

1

je pouvais pas trouver un moyen facile et finalement réglé avec

TMockFoo MockFoo; 
ON_CALL(MockFoo, Foo(_)) 
    .WillByDefault(Invoke(boost::mem_fn(&IFooable::Fooable))); 
0

Je ne peux pas tester car je ne l'ai pas Google Mock installé, mais il semble Invoke a une surcharge avec deux paramètres, l'objet et le pointeur de la méthode, il serait:

IFooable* ifooable = new IFooableImpl(...); 
TMockFoo MockFoo; 
ON_CALL(MockFoo, Foo(_)) 
    .WithArg<0>(Invoke(&ifooable,&IFooable::Fooable)); 
Questions connexes