gpt4 book ai didi

c# - 如何在 DbContext 中并行运行 Xunit 而不会发生冲突 - 主键?

转载 作者:行者123 更新时间:2023-11-30 21:27:38 27 4
gpt4 key购买 nike

我正在使用内存数据库创建 Xunit 测试。如果单独运行,测试将正确执行。但是,如果并行运行,它们会由于 dbcontext 中的主键问题而发生冲突。

解决此问题的最佳选择是什么?

  1. Xunit 有拆解能力吗?听说xunit没有支持这个。
  2. 我应该按顺序运行测试吗?
  3. 是否应该继续使用不同的 key ID?

试图研究 xunit 文档,刚开始学习 .net 编程。

错误:

"System.ArgumentException : An item with the same key has already been added. Key: 2"

代码:

2为主键,使用两次

public class ProductAppServiceTest
{
public TestContext context;
public IMapper mapper;
public ProductAppServiceTest()
{
var options = new DbContextOptionsBuilder<TestContext>()
.UseInMemoryDatabase(databaseName: "TestDatabase")
.Options;
context = new TestContext(options);

ApplicationServicesMappingProfile applicationServicesMappingProfile = new ApplicationServicesMappingProfile();
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile(applicationServicesMappingProfile);
});
mapper = config.CreateMapper();
}

[Fact]
public async Task Get_ProductById_Are_Equal()
{
context.Product.Add(new Product { ProductId = 2, ProductCode = "123", ProductName = "ABC" });
context.SaveChanges();

var ProductRepository = new ProductRepository(context);
var ProductAppService = new ProductAppService(ProductRepository, mapper);
var ProductDto = await ProductAppService.GetProductById(2);

Assert.Equal("123", ProductDto.ProductCode);
}

[Fact]
public async Task Get_ProductPrice_Are_Equal()
{
context.Product.Add(new Product { ProductId = 2, ProductCode = "123", ProductName = "ABC" });
context.SaveChanges();

var ProductRepository = new ProductRepository(context);
var ProductAppService = new ProductAppService(ProductRepository, mapper);
var ProductDto = await ProductAppService.GetProductById(2);
//Goes into Enum table to validate price is 5
Assert.Equal("5", ProductDto.Price);
}

最佳答案

这里的问题是您为每个测试使用相同的内存数据库。虽然您可以为每个测试拆除并创建数据库,但通常更容易为每个测试使用唯一的数据库。

Note: The reason each test is using the same database is because you are using a static database name.

XUnit 在每次测试之前调用测试类构造函数,因此您可以使用 guid 作为数据库名称为每个测试创建一个唯一的内存中数据库。

var options = new DbContextOptionsBuilder<TestContext>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.Options;
context = new TestContext(options);

关于c# - 如何在 DbContext 中并行运行 Xunit 而不会发生冲突 - 主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57483905/

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