gpt4 book ai didi

c# - 为什么单独的 DbContexts 在单元测试期间修改同一个 DbSet?

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:12 24 4
gpt4 key购买 nike

环境:

Xunit 2.3.1

Microsoft.EntityFrameworkCore.InMemory 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() 填充的

我把它全部移出了那里,因为担心继承会搞砸。

问题:

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

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

我试过:

让测试按顺序运行。 不起作用

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

最佳答案

Id 未重置的原因是因为 EfCore.InMemory(2.1) 中的 InMemory 数据库共享 key 生成的值。这背后的原因是他们与数据库无关。

这个讨论可以深入here

关于c# - 为什么单独的 DbContexts 在单元测试期间修改同一个 DbSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53809069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com