我已经在我的集成测试中使用了这份文档:asp.net core 集成测试,以下是我的简化版本集成测试:
public class ApplicationControllerTests : IClassFixture<CustomWebApplicationFactory<Startup>>
{
private readonly CustomWebApplicationFactory<Startup> _factory;
public ApplicationControllerTests(CustomWebApplicationFactory<Startup> factory)
{
_factory = factory;
}
[Fact]
public async Task AcceptOffer_WhenCalled_ShouldReturnSuccess()
{
var httpClient = factory.CreateClient();
var acceptOfferRequest = new AcceptOfferRequest
{
OfferId = 1,
OfferType = 1
}.ToJsonStringContent();
var response = await httpClient.PostAsync("/api/v1/Application/AcceptOffer", acceptOfferRequest);
response.EnsureSuccess();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}
正如您所见,我正在向“/api/v1/Application/AcceptOffer” API发送HTTP请求,该API会更新数据库中的一些实体,并在一切正常时返回状态码200。
测试后,我想将数据库恢复到测试之前的状态。 为此,我希望将我的测试放在事务中,并在每个测试完成后回滚。 根据当前的实现,这是否可能?因为删除并重新创建数据库是代价高昂的,这就是为什么我想将我的测试放在事务中的原因。
我正在使用MS SQL数据库和Entity Framework ORM。
一种解决方案是使用DbContext的singleton,然后在事务中包装所有测试,但问题是SQL不支持嵌套事务,如果API也使用事务,它将抛出运行时异常。
另一种解决方案是使用C#的TransactionScope,但它不适用于SQL事务,并且不适用于不同的线程。
CustomWebApplicationFactory
里面有什么内容?你是否覆盖了DbContext设置(Entity Framework)中的任何内容,还是使用了其他ORM? - kristofke