Comment vérifier qu'une méthode a été appelée exactement une fois avec Moq? La chose Verify()
contre Verifable()
est vraiment déroutante.
112
Vous pouvez utiliser Times.Once()
, ou Times.Exactly(1)
:
mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));
Voici les méthodes de la classe Times :
AtLeast
- Spécifie qu'une méthode simulée doit être invoquée au minimum.AtLeastOnce
- Spécifie qu'une méthode simulée doit être appelée une fois au minimum.AtMost
- Spécifie qu'une méthode simulée doit être invoquée au maximum.AtMostOnce
- Spécifie qu'une méthode simulée doit être invoquée une fois au maximum.Between
- Spécifie qu'une méthode simulée doit être invoquée entre les heures de et à.Exactly
- Spécifie qu'une méthode simulée doit être invoquée exactement fois fois.Never
- Spécifie qu'une méthode simulée ne doit pas être appelée.Once
- Spécifie qu'une méthode simulée doit être appelée exactement une fois.N'oubliez pas que ce sont des appels de méthode; Je n'arrêtais pas de trébucher, pensant que c'étaient des propriétés et oubliant les parenthèses.
var mockContext = new Mock<IContext>()
mettre en place cela.AtLeast
,AtMost
,Between
ouExactly
pourrait être considéré comme la propriété. Je veux dire, ils ont évidemment besoin d'un paramètre pour faire quelque chose.Imaginez que nous construisons une calculatrice avec une méthode pour ajouter 2 entiers. Imaginons en outre que l'exigence est que lorsque la méthode add est appelée, elle appelle la méthode print une fois. Voici comment nous testerions ceci:
Et voici le test réel avec des commentaires dans le code pour plus de précisions:
Remarque : Par défaut, Moq stub de toutes les propriétés et méthodes dès que vous créez un objet Mock. Donc, même sans appeler
Setup
, Moq a déjà stubé les méthodes pourIPrinter
que vous puissiez simplement appelerVerify
. Cependant, comme bonne pratique, je la configure toujours car nous pouvons avoir besoin d'appliquer les paramètres de la méthode pour répondre à certaines attentes, ou la valeur de retour de la méthode pour répondre à certaines attentes ou le nombre de fois qu'elle a été appelée.la source
Verify
,Times.Once
sans jamais appelerSetup
. Je m'attendrais certainementVerify
à exploser dans ce cas, mais ce n'est pas le cas.Mock
objet. Donc, même sans appelerSetup
, Moq a déjà stubé les méthodes pourIPrinter
que vous puissiez simplement appelerVerify
. Cependant, comme bonne pratique, je le configure toujours car nous pouvons avoir besoin d'appliquer les paramètres à la méthode ou la valeur de retour de la méthode.Times.Exactly(1)
et cela n'a pas échoué lorsque la méthode a en fait été appelée deux fois. Ce n'est qu'après l'ajoutSetup
de la méthode en question qu'elle a échoué correctement.Le contrôleur de test peut être:
Et lorsque la méthode DeleteCars est appelée avec un identifiant valide, nous pouvons le vérifier, la méthode de suppression du service appelée exactement une fois par ce test:
la source