Heim > Backend-Entwicklung > C++ > Wie kann ich Erweiterungsmethoden mit Moq simulieren?

Wie kann ich Erweiterungsmethoden mit Moq simulieren?

Susan Sarandon
Freigeben: 2025-01-21 22:21:10
Original
347 Leute haben es durchsucht

How Can I Mock Extension Methods Using Moq?

Verwenden Sie Moq, um Erweiterungsmethoden zu simulieren: Mixin-Aufrufe kapseln

Beim Testen von Klassen, die auf Erweiterungsmethoden basieren, ist es nicht trivial, diese Methoden mit Moq zu verspotten. In diesem Artikel wird dieses Problem gelöst und eine Lösung mithilfe von Wrapper-Objekten bereitgestellt.

Betrachten Sie den folgenden Code, in dem eine Schnittstelle mithilfe eines Mixins erweitert wird und eine Klasse diese Erweiterungsmethode aufruft:

public interface ISomeInterface
{
    void SomeMethod();
}

public static class SomeInterfaceExtensions
{
    public static void AnotherMethod(this ISomeInterface someInterface)
    {
        // 实现代码
    }
}

public class Caller
{
    private readonly ISomeInterface someInterface;

    public Caller(ISomeInterface someInterface)
    {
        this.someInterface = someInterface;
    }

    public void Main()
    {
        someInterface.AnotherMethod();
    }
}
Nach dem Login kopieren

In der Testmethode versuchen wir, die Schnittstelle zu verspotten und den Aufruf der Erweiterungsmethode zu überprüfen:

    [Test]
    public void Main_BasicCall_CallsAnotherMethod()
    {
        // Arrange
        var someInterfaceMock = new Mock<ISomeInterface>();
        someInterfaceMock.Setup(x => x.AnotherMethod()).Verifiable(); // 此处会报错

        var caller = new Caller(someInterfaceMock.Object);

        // Act
        caller.Main();

        // Assert
        someInterfaceMock.Verify();
    }
Nach dem Login kopieren

Dieser Test schlägt jedoch mit einer ArgumentException fehl, was darauf hinweist, dass der Mixin-Aufruf nicht direkt gemobbt werden kann.

Um dieses Problem zu lösen, können Sie ein Wrapper-Objekt erstellen, um den Mixin-Aufruf zu kapseln. Dadurch können wir Wrapper-Methoden anstelle von Erweiterungsmethoden verspotten.

Zum Beispiel:

public class SomeInterfaceWrapper
{
    private readonly ISomeInterface someInterface;

    public SomeInterfaceWrapper(ISomeInterface someInterface)
    {
        this.someInterface = someInterface;
    }

    public void AnotherMethod()
    {
        someInterface.AnotherMethod();
    }
}
Nach dem Login kopieren

In der Testmethode können wir die Wrapper-Methode nachahmen:

    [Test]
    public void Main_BasicCall_CallsAnotherMethod()
    {
        // Arrange
        var wrapperMock = new Mock<SomeInterfaceWrapper>();
        wrapperMock.Setup(x => x.AnotherMethod()).Verifiable();

        var caller = new Caller(new SomeInterfaceWrapper(wrapperMock.Object)); // 注意此处修改

        // Act
        caller.Main();

        // Assert
        wrapperMock.Verify();
    }
Nach dem Login kopieren

Dieser Ansatz bietet eine bequeme Möglichkeit, Aufrufe von Erweiterungsmethoden mithilfe von Moq zu simulieren. Indem wir die Mixin-Aufrufe in einem separaten Objekt kapseln, können wir das Verhalten der Erweiterungsmethode einfach simulieren, ohne den Originalcode zu ändern. Beachten Sie, dass der Konstruktor der Caller-Klasse eine SomeInterfaceWrapper-Instanz übergeben muss, anstatt das Mock-Objekt direkt zu übergeben.

Das obige ist der detaillierte Inhalt vonWie kann ich Erweiterungsmethoden mit Moq simulieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage