Nunit 从.Net Core 2.2迁移到3.1后,当TestHost调用API时,环境事务将丢失 一般的

Nunit 从.Net Core 2.2迁移到3.1后,当TestHost调用API时,环境事务将丢失 一般的,nunit,integration-testing,asp.net-core-3.1,transactionscope,asp.net-core-testhost,Nunit,Integration Testing,Asp.net Core 3.1,Transactionscope,Asp.net Core Testhost,我正在使用TestHost实现API的集成测试。业务逻辑被包装到TransactionScope中的操作中,如下所示: [ApiController] public class DomainController : ControllerBase { [HttpPost("test")] public async Task<IActionResult> Test() { // Debugging stuff to demons

我正在使用
TestHost
实现API的集成测试。业务逻辑被包装到
TransactionScope
中的操作中,如下所示:

[ApiController]
public class DomainController : ControllerBase
{
    [HttpPost("test")]
    public async Task<IActionResult> Test()
    {
        // Debugging stuff to demonstrate the issue
        Console.WriteLine($"Transaction is {(Transaction.Current != null ? "NOT " : "")}null");
        var curr = Transaction.Current ?? throw new Exception();
        
        // Actual business logic
        using (var scope = new TransactionScope(TransactionScopeOption.Required, TransactionScopeAsyncFlowOption.Enabled)
        {
            // ...
        }
    }
}
问题 使用.NET Core 2.2-有两件事是可行的:

  • 我在测试输出中看到来自API操作的调试消息
  • 在API操作内部,存在外部环境事务(
    transaction.Current
    不为null),因此
    newtransactionscope(TransactionScopeOption.Required,…)
    加入该事务。这是意料之中的
  • 现在,在迁移到.NET Core 3.1之后,上述所有功能都不起作用。实际上,很有趣的是,为什么测试框架没有在API操作中选择
    控制台.WriteLine
    ,但最重要的是事务

    我对正在发生的事情没有任何线索,我认为它与更新的
    TestHost
    或者可能是新的通用Web主机有关?如何从测试中获得内部事务连接外部事务的预期结果

    细节
  • 两个版本使用相同软件包的相同版本。例如,测试项目取决于:
    • nunit 3.12.0
    • NUnit3TestAdapter 3.17.0
    • Microsoft.NET.Test.Sdk 16.7.1
  • 迁移版本的不同之处在于更新了
    Startup.cs
    ,主要是行

    services.AddControllers() ... .AddApplicationPart(类型(启动).Assembly)

  • 我用.NET Core 3.1尝试了创建
    TestHost
    的两个版本-结果是相同的。旧版本是
    new-WebHostBuilder()
    ,另一个是
    new-HostBuilder()。ConfigureWebHost()

  • 我现在不能用.NETCore3.0Rigth来尝试这个问题,但我猜应该是同样的问题

  • 更新 这个github似乎是相关的,建议的修复方法是设置
    Server.PreserveExecutionContext=true

    在我的例子中,它解决了第一点——我能够像预期的那样看到调试消息。但是,在测试过程中会出现另一个错误-
    平台不支持分布式事务。但是,我想知道是什么导致它将事务升级为分布式事务

    无论如何,我已经决定采取另一种方法,使用旧的简单ADO.NET使测试在完成后进行清理-只是从所有表中删除

    不过,如果您能提供有关此主题的任何更新或其他解决方案,我将不胜感激

    [Test]
    public async Task Test()
    {
        using (var scope = new TransactionScope(TransactionScopeOption.Required, TransactionScopeAsyncFlowOption.Enabled))
        {
            Console.WriteLine($"Current tran is {(Transaction.Current != null ? "NOT " : "")}null");
            var response = await _client.PostAsync("/test");
            response.EnsureSuccessStatusCode();
        }
    }