6

En mi investigación sobre la reversión de transacciones en EF4, parece que todos se refieren a this blog post u ofrecen una explicación similar. En mi caso, quiero hacer esto en un escenario de pruebas unitarias donde quiero deshacer prácticamente todo lo que hago dentro del contexto de prueba de mi unidad para evitar actualizar los datos en la base de datos (sí, vamos a incrementar los contadores pero está bien) Para hacer esto, ¿es mejor seguir el siguiente plan? ¿Me estoy perdiendo algún concepto o algo más importante con esto (aparte de mis funciones SetupMyTest y PerformMyTest no existirán realmente de esa manera)?¿Cómo deshacerse en EF4 para Unit Test TearDown?

[TestMethod] 
public void Foo 
{ 
    using (var ts = new TransactionScope()) 
    { 
    // Arrange 
    SetupMyTest(context); 

    // Act 
    PerformMyTest(context); 
    var numberOfChanges = context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
    // if there's an issue, chances are that an exception has been thrown by now. 

    // Assert 
    Assert.IsTrue(numberOfChanges > 0, "Failed to _____"); 

    // transaction will rollback because we do not ever call Complete on it 
    } 
} 
+0

Hmm, en EF4, al parecer, la sobrecarga SaveChanges (falsa) ha quedado en desuso. Parece que SaveChanges (SaveOptions.AcceptAllChangesAfterSave) es el reemplazo, así que estoy haciendo esa actualización en mi pregunta original. – Jaxidian

Respuesta

10

Utilizamos TransactionScope para esto.

private TransactionScope transScope; 

    #region Additional test attributes 
    // 
    // Use TestInitialize to run code before running each test 
    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     transScope = new TransactionScope(); 
    } 

    // Use TestCleanup to run code after each test has run 
    [TestCleanup()] 
    public void MyTestCleanup() 
    { 
     transScope.Dispose(); 
    } 

Esto revertirá los cambios realizados en cualquiera de las pruebas.

+0

¿Tiene problemas con las transacciones pendientes al escribir/depurar las pruebas? Preferiría hacer esto en una base de datos compartida, pero no quiero hacer esto de una manera en la que lidiemos constantemente con transacciones colgantes. – Jaxidian

+0

Usted obtiene transacciones suspendidas si no realiza un desecho. Sin disponer, la transacción se suspenderá hasta que se agote el tiempo de espera. –

+0

¿Hay alguna posibilidad de que pueda actualizar su muestra de código para mostrar cómo es una prueba básica? ¿'SaveChanges (SaveOptions.AcceptAllChangesAfterSave)' es el camino correcto para hacer esto o no? – Jaxidian

Cuestiones relacionadas