Sto cercando un modo rapido per pulire i dati delle tabelle eseguendo test di integrazione con EF.Il lato negativo dell'utilizzo della transazione viene eliminato con il test di integrazione del framework di entità
Ognuno sembra avvolgere una transazione attorno al suo metodo di prova e smaltire la transazione dopo il test.
In questo modo i dati non vengono mai scritti sulla tabella.
Le cose come i nuovi ID auto per gli inserti sono ancora funzionanti, ma mi chiedo se questo metodo sia veramente affidabile rispetto a .commit() della transazione.
Ci sono aspetti negativi di utilizzo di questo approccio che sembrano non essere un vero e proprio test di integrazione come il database non viene mai toccato ...
o chiesto, in altre parole sono lì scenari difettosi che non compaiono come eccezioni utilizzando la transazione senza commit()?
UPDATE
public abstract class IntegrationTestsBase
{
protected TransactionScope TransactionScope;
public abstract void TestSetup();
protected void InitTestSetupOnTable(string tableName)
{
TransactionScope = new TransactionScope();
using (var context = new TGBContext())
{
var cmdCommand = string.Format("DBCC CHECKIDENT ({0}, RESEED, 1)", tableName);
context.Database.ExecuteSqlCommand(cmdCommand);
context.SaveChanges();
}
}
[TestCleanup]
public void TestCleanup()
{
TransactionScope.Dispose();
}
}
[TestClass]
public class MyTests : IntegrationTestsBase
{
[TestInitialize]
public override void TestSetup()
{
base.InitTestSetupOnTable("MyTableName");
}
}
L'unica vera differenza è che non si verifica la concorrenza. Quindi quando avrai bisogno (e ne avrai bisogno!) Cambierai l'approccio di transazione/rollback iniziale. Inoltre, ripristinare un backup e rilasciare un database sono poche righe di codice all'inizio/fine del test. – bubi
@bubi Ripristinare un database è più veloce di context.datebase.Create()? – Elisabeth
Se è possibile avviare test con un database vuoto, è possibile utilizzare anche Create(). Non so se è più veloce probabilmente dipende dal numero di tabelle/campi/relazioni/DBMS ... Inoltre, potrebbe essere che alcuni provider EF non supportano Create(). Nel mio caso, utilizzo Microsoft Access per testare EF e il provider supporta le migrazioni codefirst ma non supporta Create() – bubi