2012-01-30 12 views
7

estoy usando una extensión de controlador, y me trató de burlarse de ella usando FakeItEasy (v 1.7.4) así:¿es posible simular/falsificar un método de extensión?

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

pero me sale este error:

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) 

Respuesta

15

Esto no es posible. Las bibliotecas de proxy/interceptación utilizadas por FakeItEasy (y otros marcos populares gratuitos, como Moq o RhinoMocks) no permiten la interceptación de métodos estáticos (propiedades estáticas, clases selladas y métodos de instancia no virtuales, de hecho). Y el método de extensión es solo un tipo de método estático.

Puede echar un vistazo a TypeMock o JustMock, que sí tienen dicha funcionalidad.

+1

Alternativamente, si desea una opción libre, Moles también permite imitar de métodos estáticos: http: // investigación .microsoft.com/en-us/projects/pex/ –

+4

Esto puede estar llegando a FakeItEasy. Qué tan pronto, no estoy seguro - https://github.com/FakeItEasy/FakeItEasy/issues/90 –

3

Si el método de extensión se declara en un ensamblaje separado, puede vincular en un ensamblaje de reemplazo con el mismo espacio de nombres.

Aunque también deberá reemplazar otros tipos de este ensamblaje.

+1

+1: esa es una solución realmente interesante, siempre y cuando no tenga que reemplazar demasiado. –

+0

@jimmy_keen ¡Gracias! Básicamente es la costura de enlace de [Working Effectively with Legacy Code] (http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052). – TrueWill

Cuestiones relacionadas