Pouvez-vous m'aider à comprendre Moq Rappel?
À l'aide Moq et regarda Callback
mais je n'ai pas été en mesure de trouver un exemple simple pour comprendre comment l'utiliser.
Avez-vous un petit extrait de code qui expliquent clairement comment et quand l'utiliser?
Vous devez vous connecter pour publier un commentaire.
Difficile à battre https://github.com/Moq/moq4/wiki/Quickstart
Si c'est pas assez clair, je dirais que ce que un doc bug...
EDIT: En réponse à vos éclaircissements...
Pour chaque moqué méthode
Setup
vous effectuez, vous obtenez pour indiquer des choses comme:La
.Callback
mécanisme dit "je ne peux pas le décrire, mais lorsqu'un appel est en forme comme cela se produit, appelez-moi et je vais le faire ce qui doit être fait". Dans le cadre de la même couramment chaîne d'appels, vous aurez à contrôler le résultat de retour (le cas échéant) par l'intermédiaire de.Returns
". Dans le QS exemples, un exemple est qu'ils font la valeur retournée augmenter à chaque fois.En général, vous n'aurez pas besoin d'un tel dispositif très souvent (xUnit des Motifs de Test de termes pour antipatterns de l'acabit de la Logique Conditionnelle Dans les Tests), et si il n'y a pas plus simple ou moyen intégré pour établir ce dont vous avez besoin, il doit être utilisé de préférence.
Partie 3 sur 4 de Justin Etheredge du Moq série la couvre, et il y a un autre exemple de rappels ici
Callback
n'a rien à voir avec la valeur de retour (sauf si vous arrivez à le lier à l'aide de code). Fondamentalement, il permet seulement de garantir la fonction de rappel est appelée avant ou après chaque invocation (selon que vous avez enchaîné avant ou aprèsReturns
respectivement), la plaine et simple.Voici un exemple d'utilisation d'un rappel pour tester une entité envoyé à un Service de Données qui gère un insert.
Alternative méthode générique syntaxe:
Alors vous pouvez tester quelque chose comme
It.Is<T>
dans unMock.Verify
au lieu d'encombrer le test avec le temps. Mais +1 parce que je parie qu'il ya beaucoup de gens qui fonctionnera le mieux, à partir d'un exemple.Il existe deux types de
Callback
dans moq. On arrive avant les retours d'appel; l'autre qui se passe après les retours d'appel.Dans les deux rappels, nous pouvons:
Callback
est simplement un moyen d'exécuter du code personnalisé que vous voulez, quand un appel est fait à l'un de se moquer de ses méthodes. Voici un exemple simple:J'ai récemment rencontré un intéressant cas d'utilisation pour elle. Supposons que vous vous attendez à certains appels à votre fantaisie, mais ils se produisent simultanément. Vous n'avez donc aucun moyen de connaître l'ordre dans lequel ils avaient appelés, mais vous voulez savoir les appels que vous attendiez n'a lieu (indépendamment de la commande). Vous pouvez faire quelque chose comme ceci:
BTW ne pas se laisser séduire par le trompeur", avant de
Returns
" et "aprèsReturns
" distinction. C'est simplement une technique de distinction de savoir si votre code personnalisé sera exécuté aprèsReturns
a été évalué ou avant. Dans les yeux de l'appelant, à la fois avant que la valeur est retournée. En effet, si la méthode estvoid
-retour vous ne pouvez même pas appelerReturns
et pourtant, il fonctionne de la même façon. Pour plus d'informations, voir https://stackoverflow.com/a/28727099/67824.Sur les autres bonnes réponses ici, je l'ai utilisé pour exécuter la logique avant de lancer une exception. Par exemple, j'avais besoin de stocker tous les objets qui ont été passés à une méthode de vérification ultérieure, et que la méthode (dans certains cas de test) nécessaire pour lancer une exception. L'appel de
.Throws(...)
surMock.Setup(...)
remplace laCallback()
action et de ne jamais l'appeler. Cependant, par la levée d'une exception au sein de la fonction de Rappel, vous pouvez toujours faire toutes les bonnes choses qu'un rappel a à offrir, et encore lever une exception.