2015-12-18 1 views
3
virtual void doSomething(std::function<void(std::error_code result)> callback) = 0 

MockMethod1(doSomething, std::function<void(std::error_code result)> callback); 

Maintenant, quand j'écris EXPECT_CALL, comment puis-je appeler "callback"Comment appeler le pointeur de fonction qui est passé à la méthode Mock?

EXPECT_CALL(object, doSomething(testing::_)).WillRepeatedly(???); 

Que dois-je écrire à appeler mon rappel?

+0

Ajouter un commentaire? Avez-vous réussi à résoudre votre problème? –

Répondre

2

Pas besoin de faire une action personnalisée.

J'ai trouvé réponse aussi différente façon, voici ce que vous devez faire,

EXPECT_CALL (.....). WillRepeatedly (test :: InvokeArgument < 1> (arg1, arg2, ..))

1

Utilisez des actions personnalisées pour y parvenir. Pour obtenir plus de flexibilité, je suggère de créer un modèle pour une action, où le paramètre de modèle indique l'index d'argument de la fonction de rappel dans doSomething. Voici comment procéder:

ACTION_TEMPLATE(ExecuteCallback, HAS_1_TEMPLATE_PARAMS(unsigned, uIndex), AND_1_VALUE_PARAMS(callbackArg)) 
{ 
    (std::get<uIndex>(args))(callbackArg); 
} 

Notez que vous pouvez ajouter plus de paramètres de valeur si nécessaire. Maintenant, dans votre test, vous appelez la configuration des appels simulés comme ceci:

EXPECT_CALL(object, doSomething(testing::_)).WillRepeatedly(DoAll(ExecuteCallback<0>(err), Return())); 
+0

Merci, c'est génial aussi – user2317738

+0

@ user2317738 De rien! Envisagez d'augmenter la réponse si vous pensez que c'est une alternative utile. À votre santé! :) –

+0

Merci @Marko, upvoted ... en interne InvokeArgument utilise la même chose que vous avez décrite. – user2317738