2015-11-03 9 views
23

Sto cercando di utilizzare il provider InMemory EF7 per i test unitari ma la natura persistente del database InMemory tra i test mi sta causando problemi.Come posso ripristinare un provider InMemory EF7 tra i test delle unità?

Il seguente codice dimostra il mio problema. Un test funzionerà e l'altro test fallirà sempre. Anche se ho impostato _context su null tra i test, la seconda esecuzione di test avrà sempre 4 record.

[TestClass] 
public class UnitTest1 
{ 

    private SchoolContext _context; 

    [TestInitialize] 
    public void Setup() 
    { 
     Random rng = new Random(); 

     var optionsBuilder = new DbContextOptionsBuilder<SchoolContext>(); 
     optionsBuilder.UseInMemoryDatabase(); 

     _context = new SchoolContext(optionsBuilder.Options); 
     _context.Students.AddRange(
      new Student { Id = rng.Next(1,10000), Name = "Able" }, 
      new Student { Id = rng.Next(1,10000), Name = "Bob" } 
     ); 
     _context.SaveChanges(); 
    } 

    [TestCleanup] 
    public void Cleanup() 
    { 
     _context = null; 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     Assert.AreEqual(2, _context.Students.ToList().Count()); 
    } 

    [TestMethod] 
    public void TestMethod2() 
    { 
     Assert.AreEqual(2, _context.Students.ToList().Count()); 
    } 

} 

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class SchoolContext : DbContext 
{ 
    public SchoolContext(DbContextOptions options) : base(options) { } 

    public DbSet<Student> Students { get; set; } 
} 

risposta

28

La seguente chiamata cancellerà il datastore in memoria.

_context.Database.EnsureDeleted(); 
+0

Grazie per questo, ha risolto i miei problemi. Inizialmente ho provato le opzioniBuilder.UseInMemoryDatabase (persist: false); che è stato rimosso da EFCore e poi incappato in un'altra possibile soluzione per avere diversi contesti tra i test qui: http://docs.efproject.net/en/latest/miscellaneous/testing.html Preferisco la semplicità della risposta selezionata anche se per la composizione della radice di prova –

+6

Questo non sembra resettare la colonna di identificazione del database in memoria. Quindi se stai seminando i dati con una riga, il primo test vedrà la riga con ID 1, il secondo test 2, ecc. È questo in base alla progettazione? – ssmith

+0

@ssmith https://github.com/aspnet/EntityFrameworkCore/issues/4096 – djeikyb

0

Un po 'in ritardo alla festa, ma ho anche avuto lo stesso problema ma quello che ho finito è stato.

Specificare un nome di database diverso per ciascun test.

optionsBuilder.UseInMemoryDatabase(Guid.NewGuid().ToString()); 

In questo modo non dovete aggiungere

_context.Database.EnsureDeleted(); 

in tutti i test

Problemi correlati