¿Cómo puedo restablecer un proveedor de EF7 InMemory entre las pruebas unitarias?

entity-framework-core mstest unit-testing

Pregunta

Estoy tratando de utilizar el proveedor de EFM InMemory para las pruebas unitarias, pero la naturaleza persistente de la base de datos de InMemory entre las pruebas me está causando problemas.

El siguiente código demuestra mi problema. Una prueba funcionará y la otra siempre fallará. Aunque establezca el _contexto en nulo entre las pruebas, la segunda ejecución de prueba siempre tendrá 4 registros.

[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; }
}

Respuesta aceptada

La siguiente llamada borrará el almacén de datos en memoria.

_context.Database.EnsureDeleted();

Respuesta popular

Poco tarde en la fiesta, pero también me encontré con el mismo problema pero lo que terminé haciendo fue.

Especificando un nombre de base de datos diferente para cada prueba.

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

De esa manera no tienes que agregar

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

en todas tus pruebas




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué