ユニットテストのためにEF7 InMemoryプロバイダを使用しようとしていますが、テスト間でInMemoryデータベースの永続的な性質が問題を引き起こしています。ユニットテスト間でEF7 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; }
}
に
を追加する必要があり、それは私の問題を解決し、これをありがとうございました。私はinitiallを試しましたoptionsBuilder.UseInMemoryDatabase(persist:false);これはEFCoreから削除され、次にテスト間で異なるコンテキストを持つ可能性のある別の解決策を見つけました:http://docs.efproject.net/en/latest/miscellaneous/testing.html 私は選択された回答の単純さを好むただし、テストルート構成の場合 –
メモリ内のデータベースの識別列はリセットされていません。したがって、データを行にシードする場合、最初のテストではid 1の行、2番目のテスト2などが表示されます。これは設計によるものですか? – ssmith
@ssmith https://github.com/aspnet/EntityFrameworkCore/issues/4096 – djeikyb