Verwenden Sie Moq, um Erweiterungsmethoden zu verspotten
In Unit-Testszenarien kann es erforderlich sein, Erweiterungsmethoden zu simulieren, die auf vorhandene Schnittstellen angewendet werden. Bedenken Sie Folgendes:
<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>
Um die Caller
-Klasse zu testen, müssen Sie die ISomeInterface
-Schnittstelle verspotten und Aufrufe der AnotherMethod
-Erweiterungsmethoden überprüfen. Der Versuch, x => x.AnotherMethod()
direkt zu simulieren, erzeugt jedoch die Ausnahme:
<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>
Ausnahmeinformationen:
<code>System.ArgumentException: Invalid setup on a non-member method: x => x.AnotherMethod()</code>
Um dieses Problem zu lösen, besteht eine Möglichkeit darin, ein Wrapper-Objekt für die Erweiterungsmethode zu erstellen:
<code class="language-csharp">public class AnotherMethodWrapper { public static void CallAnotherMethod(ISomeInterface someInterface) { someInterface.AnotherMethod(); } }</code>
In Tests können Wrapper-Methoden verspottet werden:
<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>
Durch die Verwendung von Wrappern können Erweiterungsmethodenaufrufe simuliert und Unit-Tests durchgeführt werden. Es ist zu beachten, dass die Caller
-Klasse in diesem Beispiel geändert werden muss, um AnotherMethodWrapper
zu verwenden. Dies hängt von der spezifischen Implementierung der Caller
-Klasse ab, die möglicherweise eine Abhängigkeitsinjektion oder andere Methoden zur Injektion von AnotherMethodWrapper
erfordert Caller
.
Das obige ist der detaillierte Inhalt vonWie verspotte ich Erweiterungsmethoden in Unit-Tests mit Moq?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!