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.
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.
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.
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.
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 Guid
s correspondent aux valeurs attendues avec lesquelles vous l'avez configurée.
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");