为什么在单元测试期间,单独的DbContext会修改同一个DbSet



环境:

Xuit 2.3.1

Microsoft.EntityFrameworkCore.IMemory 2.1.0

我在三个不同的类中有三个测试方法,当分别运行时通过,但当一起运行时,只有一个通过,另外两个失败。然后,当两个再次运行时,一个会通过,另一个会失败。

我发现了这个问题,我只是不确定为什么会发生。

我将展示一些代码,代码下面是设计说明。

要点:

三个测试类别:

public class FirstReviewRepoTest
public class SecondReviewRepoTest
public class ThirdReviewRepoTest

测试方法(名称相同(:

public void GetReviewDataTest(){}
public void GetReviewDataTest(){}
public void GetReviewDataTest(){}

请参阅下面一个测试的更多代码:

[Trait("Repo","")]
public class FirstReviewRepoTest{
[Fact(DisplayName = "GetReviewDataTest")]
[Trait("Repo","FirstReviewRepo")]
pubic void GetReviewDataTest(){
var options = new DbContextOptionsBuilder<MyAppDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;
using (MyAppDbContext context = new MyAppDbContext(options)){
SeedDb(context);
AddData(context);
FirstReviewRepository repository = new FirstReviewRepository(context);
FirstReviewDM dm = repository.GetReviewData(context.ItemInstanceDocumentInstance.Last().Id);
FirstReviewDM expected = new FirstReviewDM{
Analysis = "Analysis",
Comments = "Comments",
Solution = "Solution",
Review = "Review",
ReviewerToApproved = new KeyValuePair<string,bool>
}
Assert.Equal(expected,dm);
}
private void SeedDb(MyAppDbContext){
CreateDocumentDescriptions(context);
CreateTaskDescriptions(context);
CreateDocumentFieldDescriptions(context);
//... These go on...
AddUsersWithRoleData(context); //This is where the issue begins
context.SaveChanges();
}
private void AddUsersWithRoleData(MyAppDbContext context){
List<Users> users = new List<Users>()
{
new Users { Name = "user1" },
new Users { Name = "user2" },
new Users { Name = "user3" },
new Users { Name = "user4" },
new Users { Name = "user5" },
new Users { Name = "user6" },
new Users { Name = "user7" },
new Users { Name = "user8" }
{
}

设计说明:

最初,测试类都继承自定义SeedDb(MyAppDbContext)及其所有包含方法的基类。基类还有一个名为GetContextWithData()的方法,该方法返回一个新的MyAppDbContext,该方法通过SeedDb()填充其表

我把它全部搬走了,因为担心遗产会把事情搞砸。

问题:

这三种测试方法都创建了一个存储库对象,并调用一个方法来获取各自的评审数据。在这些方法中,会调用用户数据库集,例如_context.Users.Single(x=> x.Id == document.AuthorId)。在所有三个测试文档中。AuthorId等于5。不知怎的,AddUsersWithRoleData的所有三个调用都将用户添加到看似相同的DbSet<Users>

因此,只有一个DbSet的用户Id为5。

我尝试过:

使测试按顺序运行不起作用

在添加到DbContext时为用户声明ID修复了这个问题,但破坏了将用户添加到DbSet的其他测试

ID未重置的原因是EfCore.InMemory(2.1(中的InMemory数据库共享密钥生成的值。这背后的原因是他们是Db不可知论者。

这个讨论可以在这里找到深入的

最新更新