Frage

Ich erlebe etwas seltsame Verhalten in Moq - trotz der Tatsache, dass ich ein Setup Mock-Objekt eine bestimmte Art und Weise zu handeln, und dann in genau der gleichen Art und Weise in das Objekt die Methode nenne ich Tests bin, es reagiert, als ob das Verfahren wurde nie genannt.

Ich habe folgende Controller-Aktion, die ich zu Test bin versucht:

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

My Unit-Test-Code:

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

wo AssertThat ist nur eine Klasse von meinem eigenen mit einem Bündel von Behauptung Helfern (da die Assert Klasse nicht mit Erweiterungsmethoden erweitert werden kann ... seufz ...).

Wenn ich den Test ausführen, schlägt es auf der repository.Verify() Linie mit einem 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)

Wenn ich repository.Verify() entfernen, schlägt die Sammlung assert mir zu sagen, dass das Modell zurück null ist. Ich habe auf Fehler und überprüft, dass query != null, und dass ich in den Teil des if Block genommen, in dem der Code ausgeführt wird. Keine Probleme gibt.

Warum funktioniert das nicht?

War es hilfreich?

Lösung

Ich vermute, es ist, weil das Array Sie verspotteten Repository vorbei sind in (das Ergebnis der teststring.Split(' ')) nicht das gleiche Objekt wie das ist, das wird in der Suchmethode tatsächlich übergeben (das Ergebnis der query.Split(' ')).

Versuchen Sie, die erste Zeile Ihres Setup-Code zu ersetzen mit:

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

..., die jedes Element des Arrays zu Ihrem Mock mit dem entsprechenden Element in der keywords Array übergeben vergleichen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top