Come posso resettare un provider InMemory EF7 tra i test unitari?

entity-framework-core mstest unit-testing

Domanda

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.

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 accettata

La seguente chiamata cancellerà il datastore in memoria.

_context.Database.EnsureDeleted();

Risposta popolare

Un po 'tardi alla festa, ma ho anche avuto lo stesso problema, ma quello che ho fatto è stato.

Specifica di un nome di database diverso per ciascun test.

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

In questo modo non devi aggiungere

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

in tutte le tue prove




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché