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 サイトの他の関連記事を参照してください。