유닛 테스트간에 EF7 인 메모리 공급 업체를 어떻게 재설정 할 수 있습니까?

entity-framework-core mstest unit-testing

문제

단위 테스트를 위해 EF7 InMemory 공급자를 사용하려고하지만 테스트 사이에 InMemory 데이터베이스의 지속적인 특성으로 인해 문제가 발생합니다.

다음 코드는 내 문제를 보여줍니다. 하나의 테스트가 작동하고 다른 테스트는 항상 실패합니다. 테스트간에 _context를 null로 설정하더라도 두 번째 테스트 실행에는 항상 네 개의 레코드가 있습니다.

[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 with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.