2009-02-12 18 views

Respuesta

70

¿Es posible burlarse de un método estático usando Rhino.Mocks

No, no es posible.

TypeMock puede hacerlo porque utiliza el perfilador CLR para interceptar y redirigir llamadas.

RhinoMocks, NMock y Moq no pueden hacer esto porque estas bibliotecas son más simples; no usan las API CLR Profiler. Son más simples en el sentido de que usan proxies para interceptar miembros virtuales y llamadas de interfaz. La desventaja de esta simplicidad es que no pueden simular ciertas cosas, como métodos estáticos, propiedades estáticas, clases selladas o métodos de instancia no virtuales.

21

Envuelva la llamada al método estático en un método de instancia virtual en otra clase, luego protéjalo.

+1

mejor solución para mí, pero tarde o temprano el código se impulsa debido a esta fasades. –

4

El único marco simulado que conozco que admite señales estáticas de burla es TypeMock.

Como Rytmis sugirió, debe envolver los estáticos en algo (es decir, una clase de instancia con métodos virtuales o una interfaz) que luego puede simular.

2

He estado burlando usando moq, no creo que podamos simular miembros estáticos al usar esto porque moQ crea un nuevo proxy para el objetivo (clase o interfaz). Entonces solo se pueden burlar los miembros heredables (virtuales en caso de clase, públicos en términos de interfaz). Claramente, los miembros estáticos no son heredados, de ahí el problema.

4

Este es el mayor inconveniente de Rhino Mocks. No sé si es posible que Rhino Mocks lo implemente sin un nuevo concepto de cómo hace su burla.

15

Si no puede usar TypeMock para interceptar la llamada al método, el patrón recomendado para usar es crear un proxy que reenvía a los métodos no virtuales o estáticos que le interesan probar, luego configure la expectativa en el proxy . Para ilustrar, considere las siguientes clases.

class TypeToTest 
{ 
    public void Method() { } 
} 

interface ITypeToTest 
{ 
    void Method(); 
} 

class TypeToTestProxy : ITypeToTest 
{ 
    TypeToTest m_type = new TypeToTest(); 

    public void Method() { m_type.Method(); } 
} 

Mediante la creación de este proxy, ahora se puede utilizar un ITypeToTest en el lugar de donde estaban pasando o la creación de una instancia TypeToTest, asegurándose de que la aplicación por defecto utiliza el TypeToTestProxy ya que reenvía a la aplicación real. Luego, puede crear una simulación ITypeToTest en su código de prueba y establecer expectativas en consecuencia.

Tenga en cuenta que la creación de estos proxies puede ser muy tediosa, propensa a errores y lleva mucho tiempo. Para solucionar esto, mantengo una biblioteca y un conjunto de herramientas que generan ensamblajes que contienen estos tipos por usted. Consulte this page para obtener más información.

+0

Creo que tanto la clase de proxy TypeToTest como esta interfaz ITypeToTest deben ser públicas para Rhino Mocks –