2009-08-02 5 views
3

Je rencontre un comportement étrange dans Moq - malgré le fait que je configure un objet simulé pour agir d'une certaine manière, puis j'appelle la méthode exactement De la même manière dans l'objet que je suis en train de tester, il réagit comme si la méthode n'avait jamais été appelée.L'attente sur Mock Object ne semble pas être satisfaite (Moq)

je l'action du contrôleur suivant que je suis en train de tester:

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 est juste une classe de moi-même avec un tas de helpers d'assertion (puisque la classe Assert ne peut pas être étendue avec des méthodes d'extension ... soupir ...).

Quand je lance le test, il échoue sur la ligne repository.Verify(), avec un 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 retire repository.Verify(), l'assertion de collecte ne me dit que le modèle est retourné null. J'ai débogué et vérifié que query != null, et que je suis pris dans la partie du bloc if où le code est exécuté. Aucun problème là-bas.

Pourquoi cela ne fonctionne-t-il pas?

Répondre

6

Je suppose que c'est parce que le tableau que vous transmettez dans votre référentiel mocké (le résultat de teststring.Split(' ')) n'est pas le même que celui qui est réellement passé de la méthode de recherche (le résultat de query.Split(' ')).

Essayez de remplacer la première ligne de votre code d'installation avec:

repository.Expect(r => r.SearchForContacts(
    It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll)) 

... qui comparera chaque élément du tableau passé à votre maquette avec l'élément correspondant dans le tableau keywords.

+0

Merci! Cela a fait le tour imméditement! =) Il semble que je doive lire sur le Moq, et plus particulièrement sur quand et comment utiliser le It ... construit. –

Questions connexes