EF7 InMemoryプロバイダを単体テスト間でどのようにリセットできますか?

entity-framework-core mstest unit-testing

質問

私はユニットテストのためにEF7 InMemoryプロバイダを使用しようとしていますが、テスト間のInMemoryデータベースの永続的な性質が私に問題を引き起こしています。

次のコードは、私の問題を示しています。 1つのテストは機能し、他のテストは常に失敗します。テストの間に_contextをnullに設定しても、2回目のテスト実行には常に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());

そうすることで、追加する必要はありません

_context.Database.EnsureDeleted();

あなたのすべてのテストで



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ