2 Stimmen

Moq - Wie man Änderungen an einer Referenz in einer Methode testet

Ein neuer Tag, eine neue Frage. Meine Dienstschicht hat die folgende Methode

public MatchViewData CreateMatch(string user)
{
    var matchViewData = !HasReachedMaxNumberOfMatchesLimit(user) ?
        CreateMatchAndAddToRepository(user) : 
        MatchViewData.NewInstance(new Match(user));

    matchViewData.LimitReached = HasReachedMaxNumberOfMatchesLimit(user);
    return matchViewData;
}

Die Methode ruft die Hilfsmethode this auf, um ein neues Match-Objekt zu erstellen:

private MatchViewData CreateMatchAndAddToRepository(string user)
{
    var match = new Match(user);
    MatchRepository.Add(match);
    return MatchViewData.NewInstance(match);
}

Das Repository speichert das angegebene Match-Objekt und setzt die id auf einen Wert > 0.

public void Add(Match match)
{
    Check.Require(match != null);
    var numberOfMatchesBefore = Matches.Count;
    SetIdPerReflection(match, NextVal());
    Matches.Add(match);
    Check.Ensure(numberOfMatchesBefore == Matches.Count - 1);
}

Das matchviewdata-Objekt kopiert einige Eigenschaften des match-Objekts (einschließlich der id).

Mein Unit-Test soll überprüfen, dass das resultierende Viewdata-Objekt im Service eine id > 0 hat. Um dies zu erreichen, muss ich das Repository und das Verhalten der Add-Methode mocken. Aber die Service-Methode erstellt jedes Mal ein neues Match-Objekt, wenn sie aufgerufen wird, und die Add-Methode im Repository aktualisiert das referenzierte Match-Objekt (es gibt keine Notwendigkeit für einen Rückgabewert). Ich habe keine Idee, wie ich dies mit moq lösen kann.

Dies ist mein bisheriger Einheitstest:

[Test]
public void ServiceCreateMatchReturnedMatchViewDataHasNonZeroId()
{
    var match = TestUtils.FakePersistentMatch(User, 1);
    var repositoryMock = new Mock<IMatchRepository>();
    repositoryMock.Setup(
           r => r.Add(It.IsAny<Match>())).Callback(() => match.Id = 1);
    var serviceFacade = new DefaultServiceFacade(repositoryMock.Object);

    var returnedMatch = serviceFacade.CreateMatch(User);

    Assert.That(returnedMatch.Id, Is.GreaterThan(0));
}

Ich habe einige andere Varianten ausprobiert - nichts funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X