Heim > Backend-Entwicklung > C++ > Wie verspotte ich Erweiterungsmethoden in Unit-Tests mit Moq?

Wie verspotte ich Erweiterungsmethoden in Unit-Tests mit Moq?

DDD
Freigeben: 2025-01-21 22:26:11
Original
429 Leute haben es durchsucht

How to Mock Extension Methods in Unit Tests Using Moq?

Verwenden Sie Moq, um Erweiterungsmethoden zu verspotten

In Unit-Testszenarien kann es erforderlich sein, Erweiterungsmethoden zu simulieren, die auf vorhandene Schnittstellen angewendet werden. Bedenken Sie Folgendes:

<code class="language-csharp">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();
    }
}</code>
Nach dem Login kopieren

Um die Caller-Klasse zu testen, müssen Sie die ISomeInterface-Schnittstelle verspotten und Aufrufe der AnotherMethod-Erweiterungsmethoden überprüfen. Der Versuch, x => x.AnotherMethod() direkt zu simulieren, erzeugt jedoch die Ausnahme:

<code class="language-csharp">[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();
}</code>
Nach dem Login kopieren

Ausnahmeinformationen:

<code>System.ArgumentException: Invalid setup on a non-member method:
x => x.AnotherMethod()</code>
Nach dem Login kopieren

Um dieses Problem zu lösen, besteht eine Möglichkeit darin, ein Wrapper-Objekt für die Erweiterungsmethode zu erstellen:

<code class="language-csharp">public class AnotherMethodWrapper
{
    public static void CallAnotherMethod(ISomeInterface someInterface)
    {
        someInterface.AnotherMethod();
    }
}</code>
Nach dem Login kopieren

In Tests können Wrapper-Methoden verspottet werden:

<code class="language-csharp">[Test]
public void Main_BasicCall_CallsAnotherMethod()
{
    // Arrange
    var wrapperMock = new Mock<AnotherMethodWrapper>();
    wrapperMock.Setup(x => x.CallAnotherMethod(It.IsAny<ISomeInterface>())).Verifiable();

    var someInterfaceMock = new Mock<ISomeInterface>();

    //  这里需要调整Caller的构造函数,注入wrapperMock.Object
    //  这部分需要根据实际情况修改,可能需要修改Caller类或者使用其他方法注入依赖
    var caller = new Caller(someInterfaceMock.Object); // 此处可能需要修改,注入wrapperMock.Object

    // Act
    caller.Main();

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

Durch die Verwendung von Wrappern können Erweiterungsmethodenaufrufe simuliert und Unit-Tests durchgeführt werden. Es ist zu beachten, dass die Caller-Klasse in diesem Beispiel geändert werden muss, um AnotherMethodWrapper zu verwenden. Dies hängt von der spezifischen Implementierung der Caller-Klasse ab, die möglicherweise eine Abhängigkeitsinjektion oder andere Methoden zur Injektion von AnotherMethodWrapper erfordert Caller.

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

Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage