web-dev-qa-db-fra.com

Pourquoi utiliser It.is <> ou It.IsAny <> si je pouvais simplement définir une variable?

Bonjour, J'utilise MOQ depuis un moment quand je vois ce code.

Je dois configurer un retour dans un de mes repo.

 mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(), 
                  It.IsAny<Guid>())).Returns(ReturnSomething);

J'ai trois paramètres et je viens de les voir dans l'un des articles ou blog sur le net.

Quelle est l'utilisation de It.Is <> ou It.IsAny <> pour un objet? si je pouvais utiliser Guid.NewGuid () ou d’autres types, alors pourquoi utiliser It.Is?

Je suis désolé de ne pas savoir si ma question est correcte ou si je manque des connaissances en matière de test. Mais il semble que rien ne soit faux dans les deux cas.

31
user1960948

En utilisant It.IsAny<>, It.Is<>, ou une variable ont toutes des finalités différentes. Ils fournissent des moyens de plus en plus spécifiques de faire correspondre un paramètre lors de la configuration ou de la vérification d'une méthode.

Il.IsAny

La méthode mise en place avec It.IsAny<> correspondra au paramètre tout que vous avez donné à la méthode. Ainsi, dans votre exemple, les invocations suivantes renvoient toutes la même chose (ReturnSomething):

role.GetSomething(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid());

Guid sameGuid = Guid.NewGuid();
role.GetSomething(sameGuid, sameGuid, sameGuid);

role.GetSomething(Guid.Empty, Guid.NewGuid(), sameGuid);

Peu importe la valeur réelle de Guid qui a été transmise.

C'est

Le It.Is<> construct est utile pour configurer ou vérifier une méthode, vous permettant de spécifier une fonction qui correspondra à l'argument. Par exemple:

Guid expectedGuid = ...
mockIRole.Setup(r => r.GetSomething(
                 It.Is<Guid>(g => g.ToString().StartsWith("4")), 
                 It.Is<Guid>(g => g != Guid.Empty), 
                 It.Is<Guid>(g => g == expectedGuid)))
         .Returns(ReturnSomething);

Cela vous permet de restreindre la valeur plus que n'importe quelle valeur, mais vous permet de faire preuve d'indulgence dans ce que vous acceptez.

Définir une variable

Lorsque vous configurez (ou vérifiez) un paramètre de méthode avec une variable, vous dites que vous voulez exactement cette valeur. Une méthode appelée avec une autre valeur ne correspondra jamais à votre configuration/vérification.

Guid expectedGuids = new [] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };
mockIRole.Setup(r => r.GetSomething(expectedGuids[0], expectedGuids[1], expectedGuids[2]))
         .Returns(ReturnSomething);

Maintenant, il y a exactement un cas où GetSomething renverra ReturnSomething: lorsque tous les Guids correspondent aux valeurs attendues avec lesquelles vous l'avez configurée.

59
Patrick Quirk

Si vous regardez le documentation Quickstart pour Moq

Arguments correspondants

// any value
mock.Setup(foo => foo.DoSomething(It.IsAny<string>())).Returns(true);


// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true); 


// matching ranges
mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true); 


// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");
5
Nkosi