2009-02-12 8 views

Répondre

70

Est-il possible de simuler une méthode statique utilisant Rhino.Mocks

Non, il est impossible.

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 parce que ces bibliothèques sont plus simples; ils n'utilisent pas les API du profileur CLR. Ils sont plus simples dans la mesure où 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.

21

Enveloppez l'appel de la méthode statique dans une méthode d'instance virtuelle dans une autre classe, puis simulez cette opération.

+1

meilleure solution de contournement pour moi, mais tôt ou tard le code devient boosté cuz de cette fasades. –

4

Le seul cadre fictif que je connaisse qui prend en charge la statique moqueuse est TypeMock. Comme Rytmis l'a suggéré, vous devez envelopper la statique dans quelque chose (c'est-à-dire une classe d'instance avec des méthodes virtuelles ou une interface) que vous pouvez ensuite extraire.

2

Je me moquais de l'utilisation de moq, je ne pense pas que nous pouvons 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 (virtuel en cas de classe, public 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.

4

C'est le plus grand inconvénient de Rhino Mocks. Je ne sais pas s'il est possible pour Rhino Mocks d'avoir cette implémentation sans re-concept de la façon dont elle se moque.

15

Si vous ne pouvez pas utiliser TypeMock pour intercepter l'appel de méthode, le modèle recommandé à utiliser est de créer un proxy qui redirige vers les méthodes non virtuelles ou statiques que vous souhaitez tester, puis définissez l'attente sur le proxy . Pour illustrer, considérons 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 cette procuration, vous pouvez maintenant utiliser un ITypeToTest en place de l'endroit où vous passiez ou établir une instance TypeToTest, en vous assurant que la mise en œuvre par défaut utilise le TypeToTestProxy comme le transmet à la mise en œuvre réelle. Ensuite, vous pouvez créer un ITypeToTest maquette 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, source d'erreurs et longue. Pour résoudre ce problème, je gère une bibliothèque et un ensemble d'outils qui génèrent des assemblys contenant ces types pour vous. Veuillez vous référer au this page pour plus d'informations.

+0

Je pense que la classe proxy TypeToTest et cette interface ITypeToTest doivent être publiques pour Rhino Mocks –

Questions connexes