2010-10-21 11 views
9

He extendido objetos del tipo IDataReader con algunos métodos de extensión que necesitaba. El problema ahora es cuando intento simular el IDataReader, el método extendido no está incluido en el simulacro, así que cuando se alcanza la fila Expect.Call(reader.ExtensionMethod()).Return(someValue), se ejecuta el ExtensionMethod que no es lo que quiero. Quiero que esa llamada se grabe y cuando se llame al método de extensión desde otro lugar, quiero que devuelva someValue.Cómo simular métodos de extensión con Rhino Mock?

¿Alguien sabe cómo evitar esto?

+2

posible duplicado de [¿Cómo uso Moq para simular un método de extensión?] (Http://stackoverflow.com/questions/562129/how-do-i-use-moq-to-mock-an-extension- método) – abatishchev

+1

@abatishchev: Yo diría tanto sí como no :). El tema que está sugiriendo no responde si es posible o no para RhinoMock, y también tenemos el aspecto del tiempo ... alguien podría haber encontrado una solución inteligente para esto en los últimos 18 meses. –

Respuesta

2

La respuesta parece ser no por el momento. Sin embargo, para mal, pero resolví mi problema al escribir una clase falsa para mi interfaz, quería burlarme. Como no necesitaba tantos métodos de la interfaz, fue bastante rápido.

+6

Entonces no sé por qué no aceptaste la respuesta de Slavo ya que él dice lo mismo y fue el primero :) –

13

Divulgación: Yo trabajo para Telerik.

Los métodos de extensión son en realidad métodos estáticos ocultos como métodos de instancia. RhinoMock no puede simular métodos estáticos y no hay manera de que pueda hacerlo, a menos que use otra biblioteca de burlas, que utiliza un generador de perfiles.

Tal biblioteca es JustMock by Telerik.

+0

Ok ... entonces, ¿cómo me ayuda esto a resolver el problema con RhinoMock? –

+2

No :) Siento que no sea posible con RhinoMock. RhinoMock intercepta llamadas a métodos heredando de un objeto y anulándolos (es por eso que tienen que ser virtuales). No puede anular un método estático (extensión) y esa es la razón por la cual Rhino falla en esta situación. – Slavo

+0

Entonces, TypeMock puede, ¿sí? – abatishchev

0

Es posible anclar el método de extensión o cualquier otro método estático sin ningún marco. El siguiente código le permite hacerlo, solo necesita insertar _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

En mi propia instancia, envolví los métodos de extensión que tenía que stub en los métodos de una clase de ayuda que expusieron los métodos de contenedor en una nueva interfaz. Cambié mi código de producción para inyectar una instancia de esta clase auxiliar y cambié el código para llamar a los nuevos métodos. Las pruebas unitarias están inyectando un stub convenientemente diseñado de la interfaz auxiliar.

Si bien esta solución no es perfecta, es aún menos dramática que cambiar el marco de burla.

Cuestiones relacionadas