À l'aide de Moq pour vérifier les appels sont effectués dans l'ordre correct
J'ai besoin de tester la méthode suivante:
CreateOutput(IWriter writer)
{
writer.Write(type);
writer.Write(id);
writer.Write(sender);
//many more Write()s...
}
J'ai créé une Moq avais IWriter
et je veux m'assurer que le Write()
méthodes sont appelées dans le bon ordre.
J'ai le test code suivant:
var mockWriter = new Mock<IWriter>(MockBehavior.Strict);
var sequence = new MockSequence();
mockWriter.InSequence(sequence).Setup(x => x.Write(expectedType));
mockWriter.InSequence(sequence).Setup(x => x.Write(expectedId));
mockWriter.InSequence(sequence).Setup(x => x.Write(expectedSender));
Cependant, le deuxième appel à Write()
dans CreateOutput()
(pour écrire le id
valeur) renvoie une MockException
avec le message "IWriter.Write() invocation a échoué avec des simulations de comportement Strictes. Toutes les invocations sur la maquette doit avoir un programme d'installation correspondante.".
Je suis également trouver qu'il est difficile de trouver de façon définitive, la mise à jour de la documentation et des exemples de Moq séquences.
Je fais quelque chose de mal, ou je ne peux pas définir une séquence en utilisant la même méthode?
Si non, est-il une autre solution que je peux utiliser (de préférence à l'aide Moq/NUnit)?
- double possible de Comment tester l'appel de la méthode de commande Moq
- Le dernière version de Moq, v4.2 a une "amélioration de la maquette de l'invocation de la séquence de test", selon ses notes de version.
- Je suis à l'aide d'un v. 4.2.x et peut confirmer que la séquence fonctionnalité est de travailler pour moi.
Vous devez vous connecter pour publier un commentaire.
Il y a un bug lors de l' à l'aide de MockSequence sur la même maquette. Il sera certainement corrigé dans les versions ultérieures de Moq bibliothèque (vous pouvez aussi le faire manuellement en modifiant Moq.Appel de méthode.Correspond à la mise en œuvre).
Si vous souhaitez utiliser Moq seul, alors vous pouvez vérifier l'ordre d'appel de méthode via les rappels:
Write()
méthode n'est jamais invoqué, aucune de ces rappels auront une chance de dire quoi que ce soit. Assurez-vous d'ajouter un fourre-tout de vérifier que la méthode est appelée au moins une fois.J'ai réussi à obtenir le comportement que je veux, mais il nécessite le téléchargement d'un 3e partie de la bibliothèque de http://dpwhelan.com/blog/software-development/moq-sequences/
La séquence peut être testée à l'aide de l'suivantes:
J'ai ajouté cela comme une réponse en partie pour aider à cette solution, mais je suis toujours intéressé de savoir si quelque chose de semblable pourrait être réalisé en utilisant Moq 4.0 seul.
Je ne suis pas sûr si Moq est encore en développement, mais la résolution du problème avec le
MockSequence
, ou dont le moq-séquences d'extension dans Moq serait bon de voir.J'ai écrit une méthode d'extension qui affirmera selon l'ordre d'invocation.
Il fonctionne en profitant de la manière que la fermeture de travail à l'égard de l'étendue des variables. Depuis il y a une seule déclaration pour sharedCallCount, toutes les fermetures permettront d'avoir une référence à la même variable. Avec expectedCallCount, une nouvelle instance est instancié à chaque itération de la boucle (par opposition à l'utilisation je la fermeture). De cette façon, chaque fermeture a une copie de j'ai configuré uniquement pour lui-même à comparer avec la sharedCallCount lorsque les expressions sont invoquées.
Voici un petit test unitaire pour l'extension. Notez que cette méthode est appelée dans votre section d'installation, pas votre affirmation section.
Récemment, j'ai mis en place deux caractéristiques pour Moq: VerifyInSequence() et VerifyNotInSequence(). Ils travaillent même avec en Vrac des Simulacres. Cependant, ils ne sont disponibles que dans une moq référentiel fourche:
https://github.com/grzesiek-galezowski/moq4
et attendent plus de commentaires et de tests avant de décider si elles peuvent être incluses dans officiel moq releaase. Cependant, rien ne vous empêche de télécharger les sources en tant que ZIP, de le construire dans une dll et de lui donner un essai. L'utilisation de ces fonctionnalités, la séquence de vérification, vous devez peut être écrite comme suit:
(notez que vous pouvez utiliser deux autres séquences, en fonction de vos besoins. Lâche séquence de permettre à tous les appels entre ceux que vous souhaitez vérifier. StrictSequence ne permettra pas que cela et StrictAnytimeSequence est comme StrictSequence (pas d'appels de méthode entre vérifié les appels), mais permet de la séquence à être précédée par un certain nombre de l'arbitraire des appels.
Si vous décidez de donner à cette fonctionnalité expérimentale de l'essayer, s'il vous plaît commentaire avec votre avis sur:
https://github.com/Moq/moq4/issues/21
Merci!
La solution la plus simple serait d'utiliser un La file d'attente:
Je soupçonne que expectedId n'est pas ce que vous attendez.
Cependant, je serais probablement juste écrire mon propre mise en œuvre de IWriter à vérifier dans ce cas ... probablement beaucoup plus facile (et plus facile à changer plus tard).
Désolé pour aucun Moq des conseils directement. Je l'aime, mais je n'ai pas fait ça.
avez-vous peut-être besoin d'ajouter .Vérifier() à la fin de chaque installation? (C'est une supposition bien j'ai peur).