2012-01-30 3 views
7

J'utilise une extension du contrôleur, et j'ai essayé de se moquer de l'aide FakeItEasy (v 1.7.4) comme ceci:est-il possible de simuler/simuler une méthode d'extension?

A.CallTo(() => controller.RenderView(A<string>.Ignored,A<object>.Ignored,null)).Returns(""); 

mais je reçois cette erreur:

System.NullReferenceException : Object reference not set to an instance of an object. 
at System.Object.GetType() 
at FakeItEasy.Creation.ProxyGeneratorSelector.MethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget, ref String failReason) 
at FakeItEasy.Configuration.DefaultInterceptionAsserter.AssertThatMethodCanBeInterceptedOnInstance(MethodInfo method, Object callTarget) 
at FakeItEasy.Configuration.FakeConfigurationManager.CallTo(Expression`1 callSpecification) 

Répondre

15

Ce n'est pas possible. Les bibliothèques de proxy/interception utilisées par FakeItEasy (et d'autres frameworks libres populaires, comme Moq ou RhinoMocks) n'autorisent pas l'interception de méthodes statiques (propriétés statiques, classes scellées et méthodes d'instance non virtuelles en fait). Et la méthode d'extension est juste une sorte de méthode statique.

Vous pouvez jeter un oeil à TypeMock ou JustMock, qui ont une telle fonctionnalité.

+1

Alternativement, si vous voulez une option gratuite, Moles permet aussi moqueur des méthodes statiques: http: // recherche .microsoft.com/fr-fr/projects/pex/ –

+4

Cela vient peut-être à FakeItEasy. Combien de temps, je ne suis pas sûr - https://github.com/FakeItEasy/FakeItEasy/issues/90 –

3

Si la méthode d'extension est déclarée dans un assembly séparé, vous pouvez lier dans un assembly de remplacement avec le même espace de noms.

Vous devrez également remplacer tous les autres types requis de cet assemblage.

+1

+1: c'est une solution vraiment intéressante tant que vous n'avez pas à remplacer trop. –

+0

@jimmy_keen Merci! C'est fondamentalement la couture de lien de [travaillant efficacement avec le code hérité] (http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052). – TrueWill

Questions connexes