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-有两件事是可行的:
transaction.Current
不为null),因此newtransactionscope(TransactionScopeOption.Required,…)
加入该事务。这是意料之中的控制台.WriteLine
,但最重要的是事务
我对正在发生的事情没有任何线索,我认为它与更新的TestHost
或者可能是新的通用Web主机有关?如何从测试中获得内部事务连接外部事务的预期结果
细节
- nunit 3.12.0
- NUnit3TestAdapter 3.17.0
- Microsoft.NET.Test.Sdk 16.7.1
Startup.cs
,主要是行
services.AddControllers()
...
.AddApplicationPart(类型(启动).Assembly)
TestHost
的两个版本-结果是相同的。旧版本是new-WebHostBuilder()
,另一个是new-HostBuilder()。ConfigureWebHost()
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();
}
}