ホームページ >バックエンド開発 >C++ >Moq を使用して単体テストで拡張メソッドをモックする方法

Moq を使用して単体テストで拡張メソッドをモックする方法

DDD
DDDオリジナル
2025-01-21 22:26:11432ブラウズ

How to Mock Extension Methods in Unit Tests Using Moq?

Moq を使用して拡張メソッドをモックする

単体テストのシナリオでは、既存のインターフェイスに適用される拡張メソッドをモックする必要がある場合があります。次の点を考慮してください:

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

Caller クラスをテストするには、ISomeInterface インターフェースをモックし、AnotherMethod 拡張メソッドの呼び出しを検証する必要があります。ただし、x => x.AnotherMethod() を直接シミュレートしようとすると、例外

が生成されます。
<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>

例外情報:

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

この問題を解決する 1 つの方法は、拡張メソッドのラッパー オブジェクトを作成することです。

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

テストでは、ラッパー メソッドをモックできます:

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

ラッパーを使用すると、拡張メソッド呼び出しをモックして単体テストできます。 この例の Caller クラスは、AnotherMethodWrapper を使用するように変更する必要があることに注意してください。これは Caller クラスの特定の実装に依存し、AnotherMethodWrapper を挿入するための依存関係注入またはその他のメソッドが必要になる場合があります。 Caller

以上がMoq を使用して単体テストで拡張メソッドをモックする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。