bet*_*ido 3 c# xunit async-await .net-core asp.net-core
我有一些使用 xUnit 的集成测试,需要拆除在测试期间创建的一些资源。为此,我已实施IDisposable在包含测试的类中实现。
问题是我需要使用只有异步接口的客户端删除测试期间创建的资源。但是,该Dispose方法是同步的。
我可以使用.Result或.Wait()等待异步调用的完成,但这可能会造成死锁(该问题在此处有详细说明)。
鉴于我不能使用.Resultor .Wait(),在方法中调用异步方法的正确(和安全)方法是Dispose什么?
更新:添加一个(简化的)示例来显示问题。
[Collection("IntegrationTests")]
public class SomeIntegrationTests : IDisposable {
private readonly IClient _client; // SDK client for external API
public SomeIntegrationTests() {
// initialize client
}
[Fact]
public async Task Test1() {
await _client
.ExecuteAsync(/* a request that creates resources */);
// some assertions
}
public void Dispose() {
_client
.ExecuteAsync(/* a request to delete previously created resources */)
.Wait(); // this may create a deadlock
}
}
Run Code Online (Sandbox Code Playgroud)
事实证明,xunit 实际上包含一些支持来处理我所面临的问题。测试类可以实现IAsyncLifetime以异步方式初始化和拆除测试。界面看起来像:
public interface IAsyncLifetime
{
Task InitializeAsync();
Task DisposeAsync();
}
Run Code Online (Sandbox Code Playgroud)
虽然这是我的具体问题的解决方案,但它并没有解决调用异步方法的更通用的问题Dispose(当前的答案也没有这样做)。我想为此我们需要等到IAsyncDisposable.NET core 3.0 可用(感谢 @MartinUllrich 提供此信息)。
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |