如何在單元測試之間重置EF7 InMemory提供程序?


我試圖使用EF7 InMemory提供程序進行單元測試,但測試之間的InMemory數據庫的持久性使我遇到問題。

以下代碼演示了我的問題。一個測試將起作用,另一個測試將始終失敗。即使我在測試之間將_context設置為null,第二次測試運行總會有4條記錄。

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

一般承認的答案

以下調用將清除內存中的數據存儲區。

_context.Database.EnsureDeleted();

熱門答案

派對遲到了,但我也遇到了同樣的問題,但我最終做的是。

為每個測試指定不同的數據庫名稱。

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

這樣你就不必添加

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

在你所有的測試中





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因