ホームページ >バックエンド開発 >C++ >拡張メソッドが直接サポートされていない場合、Moq を使用して拡張メソッドをモックするにはどうすればよいですか?

拡張メソッドが直接サポートされていない場合、Moq を使用して拡張メソッドをモックするにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-20 02:16:09229ブラウズ

How Can I Mock Extension Methods with Moq When It Doesn't Directly Support Them?

単体テストにおける拡張メソッドのモック: 実践的なアプローチ

単体テストには拡張メソッドのモックが必要になることがよくありますが、Moq では直接サポートがないため、最初はこのタスクに問題があるように見えます。 これは拡張メソッドの性質に由来します。拡張メソッドは本質的に既存のクラスを拡張する静的メソッドです。 ただし、Moq は静的メソッドではなく、主にオブジェクト インスタンスをモックします。

解決策は、拡張メソッドがクラスに機能を追加することを理解することにあります。 したがって、拡張メソッド自体をモックする代わりに、ターゲット クラスをモックします。

一般的なシナリオを調べてみましょう:

<code class="language-csharp">public class SomeType {
    public int Id { get; set; }
}

// ... (Extension method definition elsewhere) ...</code>

提供された例は、FirstOrDefault に適用される List<SomeType> 拡張メソッドをモックする必要性を示しています。 FirstOrDefault を直接モックする代わりに、List<SomeType> のモックを作成します:

<code class="language-csharp">var listMock = new Mock<List<SomeType>>();
listMock.Setup(l => l.FirstOrDefault(st => st.Id == 5))
        .Returns(new SomeType { Id = 5 });</code>

この設定により、指定された述語で呼び出されたときの FirstOrDefault 拡張メソッドの戻り値を定義できます。 リスト オブジェクトのモックを通じて間接的に動作を制御しています。

この手法は Moq の制限を効果的に回避し、拡張メソッドを含むシナリオを含む包括的な単体テストを可能にします。 拡張メソッドが動作するオブジェクトのモックに焦点を当てることで、その動作を制御し、堅牢なテスト カバレッジを実現します。

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

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