web-dev-qa-db-fra.com

Quel est le but de VerifyAll () dans Moq?

J'ai lu la question à Quel est le but de Verifiable () dans Moq? et j'ai cette question dans mon esprit. Besoin de votre aide pour l'expliquer.

47
Nam G VU

VerifyAll() sert à vérifier que toutes les attentes ont été satisfaites. Supposons que vous ayez:

myMock.Setup(m => m.DoSomething()).Returns(1);
mySut.Do();
myMock.VerifyAll(); // Fail if DoSomething was not called

HTH

45
ema

Je vais essayer de compléter la réponse de @ ema, cela donnera probablement plus d'informations aux lecteurs. Imaginez que vous avez raillé objet, qui est une dépendance à votre sut. Disons qu'il a deux méthodes et que vous souhaitez les configurer afin de ne pas obtenir d'exceptions ou de créer différents scénarios pour votre sut:

var fooMock = new Mock<Foo>();
fooMock.Setup(f => f.Eat()).Returns("string");
fooMock.Setup(f => f.Bark()).Returns(10);

_sut = new Bar(fooMock.Object);

C'était donc organiser étape. Maintenant, vous voulez exécuter une méthode que vous voulez réellement tester (maintenant vous act):

_sut.Test();

Vous allez maintenant affirmer avec VerifyAll():

fooMock.VerifyAll();

Que testerez-vous ici? Vous testerez si vos méthodes setup étaient appelées. Dans ce cas, si Foo.Eat() or Foo.Bark() n'a pas été appelée, vous obtiendrez une exception et le test échouera. Donc, en fait, vous mélangez organisez et affirmez les étapes. De plus, vous ne pouvez pas vérifier combien de fois il a été appelé, ce que vous pouvez faire avec .Verify (Imaginez que vous avez un paramètre Param avec une propriété appelée Name dans votre fonction Eat() fonction):

fooMock.Verify(f => f.Eat(It.Is<Param>(p => p.Name == "name")), Times.Once);
11
OlegI