2010-10-21 11 views
9

J'ai étendu les objets de type IDataReader avec certaines méthodes d'extension dont j'avais besoin. Le problème est maintenant quand j'essaye de se moquer de l'IDataReader, la méthode étendue n'est pas incluse dans le mock alors quand la ligne Expect.Call(reader.ExtensionMethod()).Return(someValue) est atteinte, le ExtensionMethod est exécuté ce qui n'est pas ce que je veux! Je souhaite que cet appel soit enregistré et lorsque la méthode d'extension est appelée à partir d'un autre endroit, je veux qu'elle renvoie someValue.Comment se moquer des méthodes d'extension avec Rhino Mock?

Est-ce que quelqu'un sait comment contourner ce problème?

+2

duplication possible de [Comment utiliser Moq pour simuler une méthode d'extension?] (Http://stackoverflow.com/questions/562129/how-do-i-use-moq-to-mock-an-extension- méthode) – abatishchev

+1

@abatishchev: Je dirais à la fois oui et non :). Le sujet que vous suggérez ne répond pas si c'est possible ou non pour RhinoMock, et nous avons aussi l'aspect temps ... quelqu'un aurait pu trouver une solution intelligente à cela au cours des 18 derniers mois. –

Répondre

2

La réponse semble être non pour le moment. Pour le pire cependant, mais j'ai résolu mon problème avec l'écriture d'une classe fictive pour mon interface, je voulais me moquer à la place. Comme je n'avais pas besoin de beaucoup de méthodes d'interface, ça allait assez vite.

+6

Alors je ne sais pas pourquoi vous n'avez pas accepté la réponse de Slavo car il dit la même chose et il était le premier :) –

13

Divulgation: Je travaille pour Telerik.

Les méthodes d'extension sont en fait des méthodes statiques dissimulées en tant que méthodes d'instance. RhinoMock ne peut pas se moquer des méthodes statiques et il n'y a aucun moyen de le faire, à moins d'utiliser une autre bibliothèque moqueuse, qui utilise un profileur.

Une telle bibliothèque est JustMock by Telerik.

+0

Ok ... alors, comment cela m'aider à résoudre le problème avec RhinoMock? –

+2

Ce n'est pas le cas :) Je suis désolé que ce ne soit pas possible avec RhinoMock. RhinoMock intercepte les appels aux méthodes en héritant d'un objet et en les remplaçant (c'est pourquoi ils doivent être virtuels). Vous ne pouvez pas remplacer une méthode statique (extension) et c'est la raison pour laquelle Rhino échoue dans cette situation. – Slavo

+0

Donc, TypeMock peut, oui? – abatishchev

0

Il est possible d'appliquer une méthode d'extension stub ou toute autre méthode statique sans cadre. Le code suivant vous permet de le faire, vous avez juste besoin de talonner _doSumm.

public static class MyExtensions 
{ 
    public static Func<int,int, int> _doSumm = (x, y) => x + y; 

    public static int Summ(this int x, int y) 
    { 
     return _doSumm(x, y); 
    } 
} 
0

Dans mon exemple, j'enveloppées les méthodes d'extension que je devais bouchonner dans les méthodes d'une classe d'aide qui ont exposé les méthodes d'enveloppe dans une nouvelle interface. J'ai commuté mon code de production pour avoir une instance de cette classe d'aide injectée et ai changé le code pour appeler les nouvelles méthodes. Les tests unitaires injectent un tronçon de l'interface auxiliaire conçu de manière pratique.

Bien que cette solution ne soit pas parfaite, elle est encore moins spectaculaire que l'échange du cadre de simulation.