L'attente sur l'objet fictif ne semble pas être satisfaite (Moq)
-
10-07-2019 - |
Question
Je rencontre un comportement étrange dans Moq. Malgré le fait que j'ai configuré un objet fictif pour qu'il agisse d'une certaine manière, puis que j'appelle la méthode exactement de la même manière dans l'objet que je teste, il réagit comme si la méthode n'a jamais été appelée.
Je tente de tester l'action du contrôleur suivante:
public ActionResult Search(string query, bool includeAll)
{
if (query != null)
{
var keywords = query.Split(' ');
return View(repo.SearchForContacts(keywords, includeAll));
}
else
{
return View();
}
}
Mon code de test unitaire:
public void SearchTestMethod() // Arrange
var teststring = "Anders Beata";
var keywords = teststring.Split(' ');
var includeAll = false;
var expectedModel = dummyContacts.Where(c => c.Id == 1 || c.Id == 2);
repository
.Expect(r => r.SearchForContacts(keywords, includeAll))
.Returns(expectedModel)
.Verifiable();
// Act
var result = controller.Search(teststring, includeAll) as ViewResult;
// Assert
repository.Verify();
Assert.IsNotNull(result);
AssertThat.CollectionsAreEqual<Contact>(
expectedModel,
result.ViewData.Model as IEnumerable<Contact>
);
}
où AssertThat
n'est qu'une classe à moi avec plusieurs assistants à l'assertion (puisque la classe Assert
ne peut pas être étendue avec des méthodes d'extension ... soupir. ..).
Lorsque j'exécute le test, il échoue sur la ligne repository.Verify ()
, avec une MoqVerificationException
:
Test method MemberDatabase.Tests.Controllers.ContactsControllerTest.SearchTestMethod() threw exception: Moq.MockVerificationException: The following expectations were not met: IRepository r => r.SearchForContacts(value(System.String[]), False)
Si je supprime repository.Verify ()
, l'assertion de collection échoue en m'indiquant que le modèle renvoyé est null
. J'ai débogué et vérifié que query! = Null
et que je suis pris dans la partie du bloc si
où le code est exécuté. Aucun problème là-bas.
Pourquoi cela ne fonctionne-t-il pas?
La solution
Je suppose que c'est parce que le tableau que vous passez dans votre référentiel simulé (le résultat de teststring.Split ('')
) n'est pas le même objet que celui qui est réellement transmis de la méthode de recherche (résultat de query.Split ('')
).
Essayez de remplacer la première ligne de votre code d'installation par:
repository.Expect(r => r.SearchForContacts(
It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))
... qui comparera chaque élément du tableau transmis à votre maquette avec l'élément correspondant dans le tableau keywords
.