106 Stimmen

Wie verwende ich Moq, um eine Erweiterungsmethode nachzubilden?

Ich schreibe einen Test, der von den Ergebnissen einer Erweiterungsmethode abhängt, aber ich möchte nicht, dass ein zukünftiger Fehler dieser Erweiterungsmethode diesen Test jemals unterbricht. Mocking das Ergebnis schien die offensichtliche Wahl, aber Moq scheint keine Möglichkeit zu bieten, eine statische Methode zu überschreiben (eine Voraussetzung für eine Erweiterungsmethode). Es gibt eine ähnliche Idee mit Moq.Protected und Moq.Stub, aber sie scheinen nichts für dieses Szenario zu bieten. Übersehe ich etwas oder sollte ich das anders angehen?

Hier ist ein triviales Beispiel, das mit der üblichen "Ungültige Erwartung an ein nicht überschreibbares Mitglied" . Dies ist ein schlechtes Beispiel für die Notwendigkeit, eine Erweiterungsmethode nachzubilden, aber es sollte reichen.

public class SomeType {
    int Id { get; set; }
}

var ListMock = new Mock<List<SomeType>>();
ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5))
        .Returns(new SomeType { Id = 5 });

Wie für alle TypeMock-Junkies, die vorschlagen, dass ich stattdessen Isolator verwenden könnte: Ich weiß die Mühe zu schätzen, denn es sieht so aus, als könnte TypeMock die Aufgabe mit verbundenen Augen und im Rausch erledigen, aber unser Budget wird in nächster Zeit nicht steigen.

3 Stimmen

Ein Duplikat ist hier zu finden: stackoverflow.com/questions/2295960/ .

7 Stimmen

Diese Frage ist ein ganzes Jahr älter als jene. Wenn es Überschneidungen gibt, ist es andersherum.

2 Stimmen

Auch 2019 keine angemessene Lösung!

2voto

Ross Punkte 2151

Das Beste, was Sie tun können, ist, eine benutzerdefinierte Implementierung für den Typ mit der Erweiterungsmethode bereitzustellen, z. B:

[Fact]
public class Tests
{
    public void ShouldRunOk()
    {
        var service = new MyService(new FakeWebHostEnvironment());

        // Service.DoStuff() internally calls the SomeExtensionFunction() on IWebHostEnvironment
        // Here it works just fine as we provide a custom implementation of that interface
        service.DoStuff().Should().NotBeNull();
    }
}

public class FakeWebHostEnvironment : IWebHostEnvironment
{
    /* IWebHostEnvironment implementation */

    public bool SomeExtensionFunction()
    {
        return false;
    }
}

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