环境:
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不可知论者。
这个讨论可以在这里找到深入的