ホームページ >バックエンド開発 >C++ >Moq を使用して拡張メソッドをモックするにはどうすればよいですか?

Moq を使用して拡張メソッドをモックするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-21 22:21:10336ブラウズ

How Can I Mock Extension Methods Using Moq?

Moq を使用して拡張メソッドをシミュレートする: Mixin 呼び出しをカプセル化する

拡張メソッドに依存するクラスをテストする場合、Moq を使用してこれらのメソッドをモックするのは簡単ではありません。この記事では、この問題を解決し、ラッパー オブジェクトを使用した解決策を提供します。

次のコードを考えてみましょう。ここでは、インターフェイスがミックスインを使用して拡張され、クラスがこの拡張メソッドを呼び出します。

<code class="language-c#">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>
テスト メソッドでは、インターフェイスをモックし、拡張メソッドの呼び出しを検証します。

<code class="language-c#">    [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>
ただし、このテストは ArgumentException で失敗し、ミックスイン呼び出しを直接モックできないことを示します。

この問題を解決するには、ラッパー オブジェクトを作成してミックスイン呼び出しをカプセル化します。これにより、拡張メソッドの代わりにラッパー メソッドをモックできるようになります。

例:

<code class="language-c#">public class SomeInterfaceWrapper
{
    private readonly ISomeInterface someInterface;

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

    public void AnotherMethod()
    {
        someInterface.AnotherMethod();
    }
}</code>
テストメソッドではラッパーメソッドをモックできます:

<code class="language-c#">    [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();
    }</code>
このアプローチは、Moq を使用して拡張メソッド呼び出しをシミュレートする便利な方法を提供します。 mixin 呼び出しを別のオブジェクトにカプセル化することで、元のコードを変更せずに拡張メソッドの動作を簡単にシミュレートできます。 Caller クラスのコンストラクターは、Mock オブジェクトを直接渡すのではなく、SomeInterfaceWrapper インスタンスを渡す必要があることに注意してください。

以上がMoq を使用して拡張メソッドをモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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