2011-04-28 21 views
6

Soy bastante nuevo en NUnit (y pruebas automáticas en general). Recientemente realicé algunos trabajos de Ruby On Rails y noté que en mi suite de pruebas, cuando creo objetos (como un nuevo usuario) y los comprometo durante el curso del paquete, nunca se comprometen con la base de datos para que pueda ejecutar el prueba una y otra vez y no te preocupes por ese usuario ya existente.NUnit Rollback After Test

Ahora estoy tratando de lograr lo mismo en NUnit, pero no estoy muy seguro de cómo hacerlo. ¿Creo una transacción en los bloques de Configuración y Desarmado? Gracias.

+1

Consulte esta pregunta http://stackoverflow.com/questions/321180/how-do-i-test-database-related-code-with-nunit –

Respuesta

5

¿Por qué hablaste con la base de datos durante las pruebas unitarias? Esto hace que su unidad de prueba a pruebas de integración por defecto. En su lugar, cree envoltorios para toda la comunicación de la base de datos, y protéjalo/simule durante las pruebas unitarias. Entonces no tiene que preocuparse por el estado de la base de datos antes y después.

Ahora, si no está dispuesto a ese nivel de refactorización: el problema con las transacciones es que necesita una conexión abierta. Por lo tanto, si su método destinado a las pruebas maneja todas las comunicaciones por sí mismo, es realmente difícil inyectar una transacción que puede crear en la configuración y deshacer durante el desmontaje.

+0

@Morten - No creo que pueda hacer pruebas simuladas y No entiendo tu segundo párrafo. ¿Puedes reformular/elaborar? Gracias. – skaz

+0

+1 Ver mi respuesta para una posible alternativa de la manera. –

+0

Quizás una solución ... se otra respuesta – Morten

5

Tal vez usted puede utilizar esto. Es feo, pero quizás puede funcionar para usted:

namespace SqlServerHandling 
{ 
[TestFixture] 
public sealed class TestTransactionRollBacks 
{ 

    private string _connectionString = "Data Source = XXXDB; ; Initial Catalog = XXX; User Id = BLABLA; Password = BLABLA"; 
    private SqlConnection _connection; 
    private SqlTransaction _transaction; 


    [SetUp] 
    public void SetUp() 
    { 
     _connection = new SqlConnection(_connectionString); 
     _transaction = _connection.BeginTransaction(); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     _transaction.Rollback(); 
    } 


    [Test] 
    public void Test() 
    { 
     Foo foo = new Foo(_connection); 

     object foo.Bar(); 



    } 


} 

internal class Foo 
{ 
    private readonly SqlConnection _connection; 
    object someObject = new object(); 
    public Foo(SqlConnection connection) 
    { 
     _connection = connection; 
    } 

    public object Bar() 
    { 
     //Do your Stuff 
     return someObject; 
    } 
} 
+2

'TransactionScope' puede ser más fácil que' SqlTransaction' si su prueba no tiene acceso a 'SqlConnection'. Ver http://stackoverflow.com/questions/321180/how-do-i-test-database-related-code-with-nunit –

0

Uso SQLite para pruebas unitarias, usando NHibenate. Incluso si no está usando NHibernate, debería ser posible hacerlo. SQLite tiene un modo en memoria, donde puede crear una base de datos en memoria y persistir allí. Es rápido, funciona bien, y puede simplemente tirar y recrear el esquema para cada prueba o accesorio como mejor le parezca.

Puede ver t he example from Ayende's blog para una descripción de cómo se hace. Está usando NHibernate, pero el concepto debería funcionar también con otros ORM o DAL.