unit test setup net mock .net unit-testing tdd mocking

.net - test - moq c#



¿Qué debería considerar al elegir un marco de burla para.Net (8)

Descargo de responsabilidad - Yo trabajo para Typemock

No estoy de acuerdo con "Typemock no te lleva a un buen diseño". Eres tú, el desarrollador que maneja un diseño bueno o malo, no la herramienta que usas. Obtenga la herramienta que hace el trabajo y hágalo productivo, pero la responsabilidad del buen diseño es suya. Si crees que envuelve todo tipo de abstracciones dentro de tu código, solo para probarlo, apúntalo, pero es posible que no tengas un diseño "bueno". Podría ser más complejo que el diseño que tienes ahora.

Hay muchos frameworks burlones para .Net. No hay un ganador claro que haya reemplazado a los demás en todos los sentidos. Los principales marcos de burla también tienen muchos estilos diferentes de uso.

El tiempo que se necesita para aprender todos los marcos de burla lo suficientemente bien como para decidir cuál usar es irrazonable. No creo que hayamos alcanzado una etapa en la que podamos hablar sobre el mejor marco de burla. Entonces, ¿qué preguntas debería hacer, tanto sobre el proyecto como sobre mí mismo, para ayudar a decidir cuál es el mejor marco de burla que se debe usar en un caso dado?

También sería útil saber por qué elegiste el marco de burla que estás usando actualmente y si aún estás satisfecho con esa elección.

¿Hay un vocabulario útil para usar al comparar los estilos de marcos de burla?

( Nota: He limitado esta pregunta a .Net ya que Java no tiene atributos ni expresión lambda, por lo que espero que los marcos de burla sean mejores para .Net y Java)

Resumen hasta el momento:

  • Si necesita simular el método estático o ninguno de los métodos virtuales, la única opción razonable es TypeMock , sin embargo, no es gratuito y no lo lleva a un buen diseño.
  • Rhino Mocks es una muy buena opción si está haciendo TDD, es decir, los objetos que desea simular implementan interfaces. En la actualidad, parece ser el "líder del mercado"
  • Se debe considerar Moq ( introduction ) si está usando .NET 3.5 Moq puede estar ganando en Rhino Mocks para nuevos proyectos

¿Qué me he perdido de este resumen?

Entonces, ¿qué impulsa la elección entre Rhino Mocks y Moq , si está utilizando .NET 3.5?

ver también:

" ¿Qué debería considerar al elegir un marco de inyección de dependencias para .NET? "También puede ser de interés ya que pregunta al" otro lado "de la pregunta.


Prefiero Moq para proyectos .NET 3.5. Es simple de usar y, en mi experiencia, ayuda a producir pruebas de unidades limpias y claras.

No hay ninguna razón técnica por la que no puedas usar más de un marco de burla en el mismo proyecto. Claro, es bueno estandarizar, pero algunas pruebas pueden prestarse mejor para algunos frameworks.


RhinoMock es prácticamente el framework de burla de vanguardia para .NET. No puedes equivocarte con eso. Supongo que puede ver su "estilo" como "Jack of all trades" si así lo desea.

Desde su sitio web :

¿Qué ofrece Rhino Mocks?

  • Modelo explícito de grabación y reproducción para las expectativas.
  • Arreglo natural, acto, sintaxis de Assert
  • Soporte para .Net 2.0 y .Net 3.5
  • Trabajando con burlas fuertemente tipadas.
  • Establecer acciones en métodos, devolver valor específico o lanzar una excepción.
  • Expectativas basadas en:
    • Argumentos que coinciden
    • Restricciones que coinciden
    • Devolución de llamada personalizada para verificar los argumentos esperados usando su propio código

Yo recomendaría FakeItEasy. Es un marco burlón muy descriptivo que permite una lectura y burla muy fácil de las interfaces. Tiene una comunidad activa de código abierto y funciona muy bien.


Yo uso Telerik JustMock , es un framework simulado muy profesional y fácil con un buen documento.


stubs ve interesante y creo que se puede enviar con .NET V4. No sé qué edición de bruja de desarrollador de estudio necesitarás usar. Actualmente puedes descargarlo desde el enlace de arriba.

Stubs es un marco ligero para comprobantes de prueba y desvíos en .NET que está basado en delegados, escribe seguro, refactorizable y genera código fuente. Stubs se diseñó para admitir el procesador de tiempo de ejecución de Code Contracts y proporciona una sobrecarga mínima para el análisis de caja blanca de Pex. Los stubs se pueden usar en cualquier método .NET, incluidos los métodos no virtuales / estáticos en tipos sellados.

(Lo publiqué como un mensaje en vez de agregarlo a la consulta, ya que nunca he usado Stabs y solo me tomé unos minutos para mirarlo)


¿Qué debería considerar al elegir un marco de burla para .Net

Otro aspecto a considerar, además del diseño de la base de código que está probando, es qué tan legibles son sus pruebas al usar simulaciones.

En este sentido, estoy poniendo un voto para NSubstitute , uno de los marcos de burla más nuevos con una API muy expresiva (sin lambdas) y una funcionalidad comparable con Moq y Rhino Mocks. Recientemente ha llegado a la versión 1.0.

Un ejemplo de uso (de la página principal de NSubstitute):

//Create: var calculator = Substitute.For<ICalculator>(); //Set a return value: calculator.Add(1, 2).Returns(3); Assert.AreEqual(3, calculator.Add(1, 2)); //Check received calls: calculator.Received().Add(1, Arg.Any<int>()); calculator.DidNotReceive().Add(2, 2); //Raise events calculator.PoweringUp += Raise.Event();

Aquí se proporciona una comparación detallada de la legibilidad de las pruebas usando RhinoMocks , Moq y NSubstitute.


Entonces, ¿qué preguntas debería hacer al preguntar sobre el proyecto y sobre mí mismo para ayudar a decidir sobre el mejor marco de burla para usar en un caso dado?

Las preguntas que debería hacerse sobre el proyecto son las siguientes: ¿El proyecto se ha desarrollado con los principios SÓLIDOS o no? ¿Es este un proyecto que tiene acoplamiento flojo y alta cohesión? ¿Se han utilizado buenos principios OO en la construcción del proyecto? ¿Se está utilizando un contenedor de Inyección de Dependencia? ¿Se ha codificado el sistema en un método de diseño por contrato (utilizando las interfaces a fondo)?

Si responde afirmativamente a estas preguntas, puede utilizar un marco burlón como RhinoMocks, que es lo que algunos llamarían un marco "obstinado". RhinoMocks, y algunos otros frameworks burlones, tienen opiniones muy fuertes acerca de cómo debe diseñarse un sistema para que se burlen de los objetos. Un marco como RhinoMocks espera que su proyecto se diseñe de cierta manera. La burla es ciertamente mucho más fácil con RhinoMocks cuando has construido tu código de la manera correcta (sin clases selladas, no estática, uso intensivo de interfaces, métodos virtuales en clase, etc.)

Si responde que no a esas preguntas, o si está trabajando en un sistema heredado con muchas clases altamente acopladas, entonces su única opción será TypeMock, que puede burlarse de casi cualquier cosa.

También sería útil saber por qué elige el marco de burla que está utilizando actualmente y si aún está contento con eso.

Elegí RhinoMocks porque en ese momento (hace más de 3 años) era claramente el marco de burla más maduro con la mayoría de las funciones. Me he quedado con eso porque ha evolucionado de manera que hace mi vida mucho más fácil (el advenimiento del contenedor AutoMocking es un paso gigantesco hacia la eficiencia).

Lo que me gusta de RhinoMocks, aparte del conjunto de características y la facilidad de uso, es que me guía hacia un mejor diseño en mi código. No soy un programador perfecto, y voy a cometer errores en el diseño. Pero herramientas como RhinoMocks y NHibernate ayudan a guiarme hacia un mejor diseño, porque cuando cometo errores y creo un diseño deficiente, estas herramientas se vuelven dolorosas para trabajar. NHibernate, por ejemplo, es doloroso trabajar con usted si tiene un diseño de base de datos incorrecto. Es muy doloroso trabajar con RhinoMocks si tienes un diseño de clase pobre, no estás usando interfaces, no estás usando IoC ... etc.

Me gusta RhinoMocks porque, en última instancia, me ayuda a ser un mejor desarrollador, y no solo porque estoy probando mi código, sino porque estoy configurando mi código, diseñando de una manera mejor.