【发布时间】:2020-11-25 06:44:28
【问题描述】:
我有以下后台服务:
public class MyBackgroundService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// Required for the method to be executed asynchronously, allowing startup to continue.
await Task.Yield();
while (!stoppingToken.IsCancellationRequested)
{
DoSomeWork();
}
}
但是,我正在努力测试这一点;我不能等待ExecuteAsync 的完成,因为Task.Yield() 只是返回到当前上下文。所以在我的测试中,await service.ExecuteAsync(token) 立即返回。
如何在不使用Thread.Sleep 的情况下进行测试?
【问题讨论】:
-
一些测试框架也支持异步测试,这意味着您可以在测试代码中等待您想要测试的异步方法。由于您使用的是 xUnit,请确保您使用的不是真正旧版本的 xUnit,您应该很好。然后基本上你还需要创建你的测试方法
async Task,然后等待对 ExecuteAsync 的调用,xUnit 应该负责其余的工作。 -
虽然
ExecuteAsync立即返回,但如果您真的在等待它返回 的任务,那么等待操作不应立即返回——除非stoppingToken被取消。请提供minimal reproducible example。 -
相当有争议的设计。如果你想在线程池线程上运行一些代码 - 为什么不直接使用
Task.Run呢?或者在这种情况下甚至更好地创建单独的线程(或使用LongRunning标志启动任务),因为您似乎正在执行一些长时间的操作,而线程池并未设计。
标签: c# asp.net-core async-await xunit