web-dev-qa-db-fra.com

Mocking Méthodes statiques utilisant Rhino.Mocks

Est-il possible de se moquer d'une méthode statique en utilisant Rhino.Mocks? Si Rhino ne supporte pas cela, y a-t-il un modèle ou quelque chose qui me permettrait d'accomplir la même chose?

46
abhilash

Est-il possible de se moquer d'une méthode statique en utilisant Rhino.Mocks

Non ce n'est pas possible.

TypeMock peut le faire car il utilise le profileur CLR pour intercepter et rediriger les appels.

RhinoMocks, NMock et Moq ne peuvent pas faire cela car ces bibliothèques sont plus simples; ils n'utilisent pas les API du profileur CLR. Ils sont plus simples car ils utilisent des proxys pour intercepter les membres virtuels et les appels d'interface. L'inconvénient de cette simplicité est qu'ils ne peuvent pas se moquer de certaines choses, telles que les méthodes statiques, les propriétés statiques, les classes scellées ou les méthodes d'instance non virtuelles.

71

Enveloppez l'appel de méthode statique dans une méthode d'instance virtuelle dans une autre classe, puis modifiez-la.

22
Rytmis

Si vous ne pouvez pas utiliser TypeMock pour intercepter l'appel de méthode, le modèle recommandé à utiliser consiste à créer un proxy qui transfère vers les méthodes non virtuelles ou statiques que vous souhaitez tester, puis définissez l'attente sur le proxy. Pour illustrer, considérez les classes suivantes.

class TypeToTest
{
    public void Method() { }
}

interface ITypeToTest
{
    void Method();
}

class TypeToTestProxy : ITypeToTest
{
    TypeToTest m_type = new TypeToTest();

    public void Method() { m_type.Method(); }
}

En créant ce proxy, vous pouvez désormais utiliser un ITypeToTest à la place de l'endroit où vous passiez ou définir une instance TypeToTest, en vous assurant que l'implémentation par défaut utilise le TypeToTestProxy comme il transmet à la mise en œuvre réelle. Ensuite, vous pouvez créer un faux ITypeToTest dans votre code de test et définir les attentes en conséquence.

Notez que la création de ces proxys peut être très fastidieuse, sujette aux erreurs et longue. Pour résoudre ce problème, je gère une bibliothèque et un ensemble d'outils qui génèrent pour vous des assemblages contenant ces types. Veuillez vous référer à cette page pour plus d'informations.

17
Steve Guidi

Le seul cadre de simulation que je connaisse qui prend en charge la statique de simulation est TypeMock.

Comme l'a suggéré Rytmis, vous devez encapsuler la statique dans quelque chose (c'est-à-dire une classe d'instance avec des méthodes virtuelles ou une interface) que vous pouvez ensuite simuler.

4
Richard Banks

C'est le plus gros inconvénient des Rhino Mocks. Je ne sais pas s'il est même possible pour Rhino Mocks de l'implémenter sans avoir à repenser la façon dont il se moque.

4
Vaccano

Je me suis moqué en utilisant moq, je ne pense pas que nous puissions nous moquer des membres statiques en utilisant cela parce que moQ crée un nouveau proxy pour la cible (classe ou interface). Ainsi, seuls les membres héritables (virtuels en cas de classe, publics en termes d'interface) peuvent être moqués. De toute évidence, les membres statiques ne sont pas hérités, d'où le problème.

2
vijaysylvester