Domanda

Sto sperimentando un comportamento strano in Moq - nonostante il fatto che io abbia impostato un oggetto finto per agire in un certo modo, e quindi chiami il metodo esattamente nello stesso oggetto nell'oggetto che sto testando, reagisce come se il metodo non è mai stato chiamato.

Ho la seguente azione del controller che sto provando a testare:

public ActionResult Search(string query, bool includeAll)
{
    if (query != null)
    {
        var keywords = query.Split(' ');
        return View(repo.SearchForContacts(keywords, includeAll));
    }
    else
    {
        return View();
    }
}

Il mio codice di test dell'unità:

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

dove AssertThat è solo una mia classe con un sacco di aiutanti di asserzione (dal momento che la classe Assert non può essere estesa con metodi di estensione ... sigh. ..).

Quando eseguo il test, non riesce sulla riga repository.Verify () , con 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)

Se rimuovo repository.Verify () , l'asserzione di raccolta non riesce a dirmi che il modello restituito è null . Ho eseguito il debug e verificato che query! = Null e che sono stato inserito nella parte del blocco if in cui viene eseguito il codice. Nessun problema lì.

Perché non funziona?

È stato utile?

Soluzione

Sospetto sia perché l'array che stai passando nel tuo repository beffardo (il risultato di teststring.Split ('') ) non è lo stesso oggetto di quello che viene effettivamente passato da il metodo di ricerca (il risultato di query.Split ('') ).

Prova a sostituire la prima riga del codice di installazione con:

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

... che confronterà ogni elemento dell'array passato al tuo mock con l'elemento corrispondente nell'array parole chiave .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top