2009-07-02 16 views
11

Estoy tratando de probar algunas clases que he hecho utilizando simulacros, pero he visto todos los marcos de burla libres en C# no pueden burlar métodos no virtuales (si es no en una interfaz).Mocking métodos no virtuales en C#

Pero, existe TypeMock que puede hacer esto, por lo que es posible. ¿Alguien puede mostrar cómo hacerlo? Incluso puedo intentar contribuir a un marco de código abierto si puedo hacer esto.

Gracias de antemano

+0

Mejor conjetura, una combinación de AppDomains, Reflection.Emit y un poco de hackers y magia. Pero no estoy calificado para hacer muchas conjeturas sobre esto. –

+0

agregado tag typemock – BengtBe

+0

Véase también http://stackoverflow.com/questions/2187513/how-to-make-aunit-test-mock-of-an-object-with-non-virtual-functions/6690183 –

Respuesta

7

De acuerdo con la website utiliza AOP para redirigir las llamadas:

Typemock aislador utiliza la tecnología orientada a aspectos para redirigir las llamadas desde el código real. Esto permite a los desarrolladores definir el comportamiento del componente externo requerido para un escenario probado. Por ejemplo, puede simular que el disco está lleno cuando escribe en una base de datos instruyendo a Typemock Isolator para que genere OutOfDiskSpaceException al escribir en la base de datos. Este es un escenario que será casi imposible de probar sin Typemock Isolator. El desarrollador define el comportamiento en la prueba de la unidad real y Typemock Isolator aísla automáticamente todos los componentes requeridos.

Esta técnica requiere que configure un entorno especial antes de poder ejecutar la prueba o usar un complemento VS.

Algunas personas piensan que la capacidad de burlarse de todo hace que Typemock sea demasiado poderoso, ya que no tiene que pensar demasiado sobre un buen diseño. Una cita de Ayende:

La principal debilidad de Tipo Mock es su poder, que me permite tomar atajos que no desea tomar, quiero conseguir un sistema con bajo acoplamiento y alta cohesión.

Pero, por supuesto, ya que es el creater de Rhino Mock no es :) objetivo

yo creo que está en para una gran cantidad de trabajo si se desea crear un marco de burla con esta funcionalidad , así que recomendaría comprar Typemock, o aprender a codificar sin él :)

+0

Usted es necesario configurar un entorno especial antes de ejecutar TypeMock (también hay un complemento VS para esto), y estoy de acuerdo con que TypeMock tenga "sogas más que suficientes para ahorcarse" –

+0

¡Gracias, Blair, actualizó la publicación para reflejar su comentario! – BengtBe

+0

Bueno, supongo que los escenarios principales para typemock es si necesitas trabajar con un sistema heredado o de un tercero donde no puedes (fácilmente) cambiar el diseño y aún deseas agregar pruebas unitarias y burlar ciertas cosas. – ChrisWue

14

Soy de Typemock, y no me referiré a los comentarios "Demasiado poderosos" (aunque me supera el por qué las personas no querrían usar la mejor herramienta para el trabajo).

Así es como funciona Typemock Isolator. ¿Alguna vez ha usado un perfilador de rendimiento? Isolator es un perfilador. Se engancha en el CLR y dentro del tiempo de ejecución de la prueba, cambia los métodos. Cuando un método obtiene JITted, lo cambia, por lo que cuando se ejecuta el método, antes de ejecutar el código original, se pregunta: ¿debo ejecutarlo como se pretendía originalmente y, en caso negativo, qué debo hacer? Y debido a esta tecnología específica, puede burlarse de cualquier método y tecnología .Net. Eso es.

Cuando establece un comportamiento utilizando la API, la respuesta a las preguntas se vuelve intersting y cambia el comportamiento en el tiempo de ejecución de ese método. Simple, pero bajo las cubiertas es un montón de trabajo :)

Isolator viene con un complemento VS para hacer que las pruebas se ejecuten sin problemas en VS, y con una herramienta de línea de comandos y tareas de MSBuild o NAnt para su uso en un servidor de compilación.

Estaremos encantados de responder cualquier otra pregunta que pueda tener.

+2

¡Tienes que ser realmente bueno para no cortarte cuando usas cuchillos afilados reales! ;). Supongo que eso es lo que querían decir con los comentarios "demasiado poderosos". –

Cuestiones relacionadas