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

Wie verspotte ich Erweiterungsmethoden in Unit-Tests mit Moq?

DDD
DDDOriginal
2025-01-21 22:26:11465Durchsuche

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>

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>

Ausnahmeinformationen:

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

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>

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>

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!

Stellungnahme:
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