250 votes

Mocking des méthodes d'extension avec Moq

J'ai une interface préexistante...

public interface ISomeInterface
{
    void SomeMethod();
}

et j'ai étendu cette interface en utilisant un mixin...

public static class SomeInterfaceExtensions
{
    public static void AnotherMethod(this ISomeInterface someInterface)
    {
        // Implementation here
    }
}

J'ai une classe qui appelle ceci et que je veux tester...

public class Caller
{
    private readonly ISomeInterface someInterface;

    public Caller(ISomeInterface someInterface)
    {
        this.someInterface = someInterface;
    }

    public void Main()
    {
        someInterface.AnotherMethod();
    }
}

et un test où je voudrais simuler l'interface et vérifier l'appel à la méthode d'extension...

    [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();
    }

L'exécution de ce test génère cependant une exception...

System.ArgumentException: Invalid setup on a non-member method:
x => x.AnotherMethod()

Ma question est la suivante : existe-t-il un moyen agréable de simuler l'appel à un mixin ?

4 votes

D'après mon expérience, les termes mixin et méthodes d'extension sont des choses distinctes. J'utiliserais le second dans ce cas pour éviter les confusions :P

3 votes

0voto

Grzenio Points 16802

Je pense qu'il n'est pas possible de simuler les méthodes d'extension. Ce sont effectivement des méthodes statiques avec un peu de sucre syntaxique par-dessus, et vous ne pouvez pas les simuler. Encore une autre raison d'éviter d'utiliser les méthodes d'extension :)

0voto

azheglov Points 3548

Je viens d'avoir le même problème et j'ai vite compris qu'une mèche roulée à la main a été très facile à créer. Il faut absolument l'envisager comme une option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X