2015-11-03 1 views
23

ユニットテストのために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; } 
} 

答えて

28

次の呼び出しで、メモリ内のデータストアがクリアされます。

_context.Database.EnsureDeleted(); 
+0

_context.Database.EnsureDeleted(); 

を追加する必要があり、それは私の問題を解決し、これをありがとうございました。私はinitiallを試しましたoptionsBuilder.UseInMemoryDatabase(persist:false);これはEFCoreから削除され、次にテスト間で異なるコンテキストを持つ可能性のある別の解決策を見つけました:http://docs.efproject.net/en/latest/miscellaneous/testing.html 私は選択された回答の単純さを好むただし、テストルート構成の場合 –

+6

メモリ内のデータベースの識別列はリセットされていません。したがって、データを行にシードする場合、最初のテストではid 1の行、2番目のテスト2などが表示されます。これは設計によるものですか? – ssmith

+0

@ssmith https://github.com/aspnet/EntityFrameworkCore/issues/4096 – djeikyb

0

私はパーティーに遅れていましたが、私も同じ問題に遭遇しました。

テストごとに異なるデータベース名を指定します。

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

あなたはいけないそうすれば、すべてのテスト

関連する問題