Utilisez Moq pour vous moquer des méthodes d'extension
Dans les scénarios de tests unitaires, il peut être nécessaire de simuler les méthodes d'extension appliquées aux interfaces existantes. Considérez ce qui suit :
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(); } }
Afin de tester la classe Caller
, vous devez vous moquer de l'interface ISomeInterface
et vérifier les appels aux méthodes d'extension AnotherMethod
. Cependant, essayer de simuler x => x.AnotherMethod()
produit directement l'exception :
[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(); }
Informations sur les exceptions :
<code>System.ArgumentException: Invalid setup on a non-member method: x => x.AnotherMethod()</code>
Pour résoudre ce problème, une solution consiste à créer un objet wrapper pour la méthode d'extension :
public class AnotherMethodWrapper { public static void CallAnotherMethod(ISomeInterface someInterface) { someInterface.AnotherMethod(); } }
Dans les tests, les méthodes wrapper peuvent être moquées :
[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(); }
En utilisant des wrappers, les appels de méthodes d'extension peuvent être simulés et testés unitairement. Il convient de noter que la classe Caller
dans cet exemple doit être modifiée pour utiliser AnotherMethodWrapper
. Cela dépend de l'implémentation spécifique de la classe Caller
, qui peut nécessiter une injection de dépendances ou d'autres méthodes pour injecter AnotherMethodWrapper
dans. Caller
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!