2010-12-15 10 views
6

Tenemos una aplicación impulsada por datos increíblemente. Queremos probar la aplicación de manera unitaria, pero los desarrolladores se resisten a crear repositorios totalmente falsos debido al volumen de datos. Realmente no los culpo.Pruebas unitarias ASP.NET MVC con datos

Comprenda que estamos actualizando pruebas en una aplicación existente. Si empezáramos de nuevo, haríamos una tonelada de cambios arquitectónicos para facilitar una mejor prueba unitaria con repositorios falsos.

Nos gustaría distribuir un archivo mdf conocido con las pruebas, copiarlo y usarlo para realizar nuestras pruebas. ¿Hay una técnica aprobada para esto? Estoy familiarizado con la incrustación de recursos en el dll de prueba, pero no con la incrustación de mdf's, si eso puede hacerse.


Una solución (tipo de):

acabé teniendo la DataContextWrapper de puesto de Andrew Tokeley de Falsa Linq contextos de datos (http://andrewtokeley.net/archive/2008/07/06/ mocking-linq-to-sql-datacontext.aspx) y creó un FakeDataContext.cs que básicamente es un montón de listas.

me escribió una plantilla T4 verdaderamente bárbara (piensa "SELECT * FROM < # = # table.BaseClass.QualifiedName>") para copiar los datos de una buena base de datos conocida para crear una gran clase llena de cosas como:

List<Customer> _customers = new List<Customer>(); 
_customers.Add(new Customer(){CustomerId = 1, CustomerName = "ACME"}); 

etc.

La clase es 25K líneas pero desde t4 escribe todas esas líneas, a quién le importa? Nos permite simular solo el contexto de datos, por lo que podemos probar nuestro linq contra el contexto falso con alguna seguridad razonable de que obtuvimos las consultas correctas. Los desarrolladores originales pusieron un montón de lógica empresarial en el repositorio, por lo que nos permite probar la lógica contra datos buenos conocidos.

+1

Lo que está buscando es una forma de hacer pruebas de integración, que @Jakub ha proporcionado una buena respuesta. ¿Qué marco de prueba estás usando? – mkchandler

+0

Vanilla VS 2010 para conducir nuestras pruebas de unidad (¿pequeña integración?). Cosas como: ¿la capa de membresía bloquea correctamente una cuenta después de 5 contraseñas incorrectas? Eso, y un montón de Selenio para verificar todo el lío funciona la sopa de nueces. –

Respuesta

5

¿Puede configurar una base de datos de prueba en un servidor compartido para que no tenga que implementar archivos mdf?

Además, ¿puede ajustar todas las pruebas de unidad con TransactionScope?

He usado una base de datos de prueba en mi empresa que contenía un conjunto de datos de referencia bien conocidos para todas las pruebas y creó una clase base para las pruebas de integración de esa manera:

[TestClass] 
public class ServiceTest 
{ 
    private TransactionScope Transaction { get; set; } 

    [TestInitialize] 
    public virtual void TestInitialize() 
    { 
     Transaction = new TransactionScope(); 
    } 

    [TestCleanup] 
    public virtual void TestCleanup() 
    { 
     Transaction.Dispose(); 
    } 
} 

Cada prueba deshacer todos lo que es cambios así que no hay problema con los datos de prueba que contaminan la base de datos.

+1

Técnicamente hablando, estos se llamarían "Pruebas de integración". Este es el enfoque que uso en mis proyectos, ¡y funciona genial! – mkchandler

+0

También se debe tener en cuenta que xUnit proporciona una forma integrada de hacerlo: http: //xunit.codeplex.com/ – mkchandler

+0

@mkchandler - tienes razón - editó la respuesta. ¡Aclamaciones! –

0

¿Has mirado un marco de burla? Si su código está escrito de tal manera que las dependencias de datos pueden ser inyectadas en los objetos que está probando, entonces podrá burlarse de esas dependencias de datos.

He tenido un gran éxito con Moq, pero luego escribí mi código con inyección de dependencia desde el principio.

+0

Brian mencionó que la aplicación está fuertemente impulsada por datos: supongo que burlarse (una gran práctica) podría no ser muy factible. Solía ​​trabajar en la aplicación que utilizaba tantos datos de la base de datos y la lógica se extendió a tantas clases/servicios que sería imposible burlarse de ella sin volver a escribirla primero ;-) –

+0

Sí, es un desastre. Usamos moq donde podemos, pero las cantidades de datos falsos son una locura. Estamos inyectando las dependencias de datos, pero los repositorios falsos se están volviendo enormes. –

Cuestiones relacionadas