2009-12-18 14 views
8

Actualmente estoy leyendo un libro (Pro ASP.Net Framework).¿Por qué utilizar un marco de burla en lugar de rodar manualmente nuestros simulacros?

En este libro, el autor sugiere usar un Moq framework para ayudar a hacer TDD.

[Test] 
public void List_Presents_Correct_Page_Of_Products() 
{ 
    IProductsRepository repository = MockProductsRepository(
     new Product { Name = "P1" }, new Product { Name = "P2" }, 
     new Product { Name = "P3" }, new Product { Name = "P4" }, 
     new Product { Name = "P5" } 
    ); 

    ProductsController controller = new ProductsController(repository); 
    ... 
} 


static IProductsRepository MockProductsRepository(params Product[] prods) 
{ 
    // Generate an implementor of IProductsRepository at runtime using Moq 
    var mockProductsRepos = new Moq.Mock<IProductsRepository>(); 
    mockProductsRepos.Setup(x => x.Products).Returns(prods.AsQueryable()); 
    return mockProductsRepos.Object; 
} 

En la capa de modelo, definimos un FakeRepository y un SqlRepository.

El hecho es que no veo la ventaja de usar este marco moq. ¿Por qué no solo usamos nuestro FakeRepository? ¿O borrar nuestro FakeRepository y agregar producto falso en él?

Al principio, pensé que el marco moq estaba allí para generar datos falsos, por lo que no es necesario si tiene, por ejemplo, 100 objetos falsos para generar.

¿Qué extraño?

Respuesta

12

Algunas ventajas de los marcos simulacros de más de burla enrollados a mano:

  • El comportamiento maqueta está más cerca de las normas de prueba, ya que es en el código de prueba. Esto hace que las pruebas sean más fáciles de entender sin tener que mirar otro código.
  • No necesita crear otra clase falsa (o algo peor: agregar lógica a una existente) simplemente porque desea un comportamiento ligeramente diferente.
  • Terminas escribiendo menos texto estándar porque solo necesitas configurar los métodos que quieres simular, mientras que con los manuales, tienes que implementar toda la interfaz.

Algunas desventajas:

  • usted tiene que aprender un marco, mientras que cualquier persona puede escribir burla con la mano.
  • Es otra dependencia que agrega a su proyecto.

(Esto es lo que se me ocurre en este momento. Siéntase libre de editar y añadir más.)

+2

El repositorio de Mock también se puede usar para generar excepciones, en lugar de modificar el repositorio falso en la oscuridad. –

-1

La usamos para hacer esencialmente un servidor falso en un entorno cliente/servidor.

De esta manera, las llamadas no tienen que ir del cliente al servidor, a la base de datos y viceversa. Simplemente van al servidor simulado, al que se le dice que devuelva un determinado objeto/valor para una llamada determinada, y esperan que se realicen ciertas llamadas.

+2

¿Y por qué utilizar Moq en lugar de escribir una clase FakeServer a mano? –

+0

Ya tenemos el servidor escrito en una interfaz específica. Burlarse básicamente llena los talones de los métodos que no usamos. Si solo queremos probar uno o dos métodos, no tenemos que crear una implementación completa de la interfaz. –

2

Un marco de burla lo libera de la carga de crear objetos simulados únicos, que devuelven datos específicos a su caso de prueba. También permiten probar si ciertos métodos o propiedades han sido accedidos o modificados (por los consumidores del objeto simulado). Esto le permite probar más fácilmente, y por lo tanto hacer cumplir, cierto comportamiento esperado.

Los marcos falsos son solo herramientas. Claro que podría hacerlo manualmente, pero puede pasar tiempo manteniendo clases que son solo para probar.

Una pregunta similar está disponible here.

-1

que imita le permite controlar la entrada procedente de verificar que la salida se produce correctamente. Por ejemplo, puede pasar datos que sabe que serán erróneos, y luego probar que sus métodos arrojan realmente ese error, y puede pasar datos válidos y probar que los datos válidos son devueltos por el objeto.

Hay más frameworks que solo Moq; hay RhinoMocks y TypeMock (mi favorito personal aunque cuesta dinero a menos que sea un proyecto de código abierto) por nombrar algunos.

Cuestiones relacionadas