Maison > développement back-end > C++ > Comment se moquer des méthodes d'extension dans les tests unitaires à l'aide de Moq ?

Comment se moquer des méthodes d'extension dans les tests unitaires à l'aide de Moq ?

DDD
Libérer: 2025-01-21 22:26:11
original
485 Les gens l'ont consulté

How to Mock Extension Methods in Unit Tests Using Moq?

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();
    }
}
Copier après la connexion

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();
}
Copier après la connexion

Informations sur les exceptions :

<code>System.ArgumentException: Invalid setup on a non-member method:
x => x.AnotherMethod()</code>
Copier après la connexion

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();
    }
}
Copier après la connexion

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();
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal