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