Moq-It.IsAny () toujours retourner null

ce qui peut causer It.IsAny<string>() pour retourner null à chaque appel? Est-ce que je me trompe en présumant qu'il est conçu pour retourner une chaîne non-null?

Voici l'usage - où la méthode Login lance une ArgumentNullException pour un argument nul 2nd (chaîne de connexion). J'ai été en supposant que It.IsAny<string>() fournirait une chaîne non-null, qui contournerait L'ArgumentNullException.

var mockApiHelper = new Mock<ApiHelper>();
mockApiHelper.Setup(m => m.Connect(It.IsAny<string>(), 
                                   It.IsAny<string>(), 
                                   It.IsAny<string>()));

var repositoryPlugin = new RepositoryPlugin(mockApiHelper.Object);
repositoryPlugin.Login(new CredentialsInfo(), It.IsAny<string>());

Assert.IsTrue(repositoryPlugin.LoggedIn, 
    "LoggedIn property should be true after the user logs in.");
18
moq
demandé sur Ray Hayes 2011-05-23 18:29:53

3 réponses

Eh bien,It.IsAny<TValue> retourne le résultat de l'appel à Match<TValue>.Create - qui à son tour renvoie default(TValue). Ce sera null pour tout type de référence.

il n'est pas clair si vous l'appelez vraiment sur le bon objet cependant - ne devriez-vous pas l'appeler sur le faux plutôt que sur le code réel?

Tous les échantillons que j'ai vu utiliser It.IsAny dans le cadre d'un mock.Setup appel. Pourriez-vous donner plus d'informations sur la façon vous essayez de l'utiliser?

24
répondu Jon Skeet 2011-05-23 14:37:40

Non, Ça.IsAny est utilisé pour spécifier dans votre configuration que toute chaîne de caractères passée correspondra. Vous pouvez faire votre configuration de sorte que si votre méthode est appelée seulement avec une chaîne particulière, elle reviendra. Considérez ceci:

myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123);
myMock.Setup(x => x.DoSomething("SpecialString").Return(456);

Tout ce qui utilise le mock obtiendra alors des valeurs différentes selon le paramètre que le mock est passé lorsque DoSomething est invoqué. Vous pouvez faire la même chose en vérifiant les appels de méthode:

myMock.Verify(x => x.DoSomething(It.IsAny<string>())); // As long as DoSomething was called, this will be fine.
myMock.Verify(x => x.DoSomething("SpecialString"));  // DoSomething MUST have been called with "SpecialString"

aussi, je vois que vous avez modifié votre question. Plutôt de:

Assert.IsTrue(repositoryPlugin.LoggedIn, "LoggedIn property should be true after the user logs in.");

faire ceci:

mockApiHelper.Verify( x => x.Connect(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once()); // Change times to whatever you expect.  If you expect particular values, replace the relevent It.IsAny<string() calls with those actual vaules.
10
répondu Andy 2011-05-23 14:53:39

It.IsAny est utilisé pour correspondre à son code dans votre Returns() et Callback() ce contrôle ce qui est poussé dans vos tests.

2
répondu Yaur 2011-11-17 13:32:22