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>
    );
}

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?

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top