moq-Objekte Gibt die Methode zurück, die ein Nullobjekt zurückgeben soll

76

Ich entwickle eine Web-API, und einer der Tests, die ich mir ausgedacht habe, ist, dass, wenn der Client eine GET-Operation mit einer physischen Test-ID ausführt (physischer Test ist die Ressource, nach der ich suche) und dieser physische Test nicht gefunden wird sollte die Web-API einen 404-Status zurückgeben.

Jetzt verwende ich das moq-Framework für meine Tests und habe den folgenden Code:

[TestMethod]
public void then_if_physical_test_not_found_return_not_found_status()
{
    var unitOfWork = new Mock<IUnitOfWork>();
    var repository = new Mock<IRepository<PhysicalTest>>();
    repository.Setup(r => r.FindById(It.IsAny<int>())).Returns();
    unitOfWork.Setup(m => m.PhysicalTests).Returns(repository.Object);
    var pt = new PhysicalTestResource(unitOfWork.Object);
    HttpResponseMessage<PhysicalTest> response = pt.GetPhysicalTest(43);
    Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode)
}

Ich benötige die Returns () -Methode, um ein Nullobjekt zurückzugeben. Dies ist das, was die eigentliche API-Methode zurückgeben würde, wenn die Ressource nicht gefunden wird.

Ich habe versucht, null als Parameter in der Returns () -Methode zu senden, hatte aber keinen Erfolg.

Daniel
quelle

Antworten:

219

Sie geben nicht an, was der Fehler war, aber dies sollte funktionieren:

unitOfWork.Setup(m => m.PhysicalTests).Returns((IRepository<PhysicalTest>)null);

Ich vermute, Sie haben versucht, es mit aufzurufen Returns(null), was dazu führt, dass sich der Compiler beschwert, da er Returnsüberlastet ist und nicht weiß, welche Methode aufgerufen werden soll. Durch das Umwandeln in einen bestimmten Typ wird die Mehrdeutigkeit beseitigt.

Jeff Ogata
quelle
7
es hat funktioniert, aber ich musste diese Änderung vornehmen: unitOfWork.Setup (m => m.PhysicalTests) .Returns ((PhysicalTest) null);
Daniel
1
ah, ok ... Ich nahm an, dass, da Sie versucht haben zurückzukehren repository.Object, dies der Typ war, der von zurückgegeben wurde PhysicalTests.
Jeff Ogata
Ich habe das Gleiche versucht und erhalte eine System.NotSupportedException. {"Ungültiges Setup für ein nicht virtuelles (in VB überschreibbares) Mitglied: x => x.GetFoo (.value.Id)"} Irgendwelche Ideen?
Dan Csharpster
@DanCsharpster Sie können Moq nur für Schnittstellen oder abstrakte Klassen mit virtuellen Mitgliedern verwenden. Unabhängig davon, welche Klasse Sie verwenden, handelt xes sich entweder um eine konkrete Klasse oder um eine abstrakte Klasse, die GetFoo()nicht virtuell / überschreibbar ist.
bcr
1
Ich kann diese Methode zur Lösung der Überlastungsmehrdeutigkeit empfehlen. Ich möchte nur erwähnen, dass Sie, da die beiden hier nicht generischen Überladungen Returnsunterschiedliche Namen für ihren Parameter haben, die Mehrdeutigkeit auch durch Schreiben auflösen können: ... .Returns(value: null)(Hier valueist nur der Name des Parameters in der gewünschten Überladung ist kein Schlüsselwort).
Jeppe Stig Nielsen
8

rt ist eine Rückgabemethode: FindById

repository.Setup(r => r.FindById(It.IsAny<int>())).Returns(Task.FromResult((rt)null));

Radhika Patwari
quelle