Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp net核心集成测试每次测试后回滚事务_C#_Unit Testing_Asp.net Core_Integration Testing_Xunit - Fatal编程技术网

C# asp net核心集成测试每次测试后回滚事务

C# asp net核心集成测试每次测试后回滚事务,c#,unit-testing,asp.net-core,integration-testing,xunit,C#,Unit Testing,Asp.net Core,Integration Testing,Xunit,我已将此文档用于集成测试:这是我的简化集成测试: public class ApplicationControllerTests : IClassFixture<CustomWebApplicationFactory<Startup>> { private readonly CustomWebApplicationFactory<Startup> _factory; public ApplicationControllerTests(

我已将此文档用于集成测试:这是我的简化集成测试:

 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);
    }
}
公共类应用程序控制器测试:IClassFixture
{
私有只读CustomWebApplicationFactory\u工厂;
公共应用程序控制器测试(CustomWebApplicationFactory)
{
_工厂=工厂;
}
[事实]
公共异步任务AcceptOffer\u何时调用\u ShouldReturnSuccess()
{
var httpClient=factory.CreateClient();
var acceptOfferRequest=新acceptOfferRequest
{
奥菲德=1,
OfferType=1
}.tojsonString内容();
var response=wait httpClient.PostAsync(“/api/v1/Application/AcceptOffer”,acceptofferquest);
response.EnsureSuccess();
Assert.Equal(HttpStatusCode.OK,response.StatusCode);
}
}
如您所见,我正在向“/api/v1/Application/AcceptOffer”api发送一个HTTP请求,该请求更新数据库中的一些实体,如果一切正常,则返回状态代码200

在测试之后,我想像测试之前一样清理数据库。为此,我希望将测试放在事务中,并在每个测试完成后回滚。目前的实施是否可行?删除和重新创建数据库的成本很高,这就是为什么我希望将测试放在事务中

我正在使用MS SQL数据库和实体框架ORM


一种解决方案是使用DbContext的单例,然后将所有测试包装到事务中,但问题是SQL不支持嵌套事务,如果API也使用事务,它将抛出运行时异常。
另一个解决方案是使用C#的TransactionScope,但它不适用于SQL事务,也不适用于不同的线程。

好的,我发现使用事务解决这个问题没有好的方法或可能。我编写了全局脚本,手动截断所有表,并在每次测试后执行,而不是事务。这显然比删除和重新创建数据库快。

您可以使用内存中的数据库提供程序。我更喜欢生产数据库的精确副本。内存中的数据库可能工作不一样您的
CustomWebApplicationFactory中有什么?您是否覆盖了DbContext设置(实体框架)中的任何内容,还是使用了其他ORM?我使用的是实体框架,不覆盖任何内容。只是更改宿主环境以读取不同的应用程序设置。一种解决方案是使用单一的DbContext,然后将所有测试包装到事务中,但问题是sql不支持嵌套事务,C#的TransactionScope不适用于不同的线程。您可以扩展DbContext并覆盖savechanges。。。