我正在创建单元测试以协助构建一些代码,这些代码将接受并排队(如果需要)来 self 的 Controller 的入站请求。
在我的单元测试中,我希望几乎同时触发两行代码,尽管调用之间有 2 秒的延迟。这允许触发我的逻辑的第一个分支,然后在第二次调用时,因为已经看到传递的数据,所以使用备用逻辑分支。
我已经接近了,但感觉很乱。我正在使用以下代码,它会立即传递我的第一个调用并继续执行后续代码行。
Task.Factory.StartNew(() => stubbedQueueHandler.QueueProcessor(setupModel));
Thread.Sleep(2000);
//second call
stubbedQueueHandler.QueueProcessor(setupModel);
await Task.Delay(10000);
然而,单元测试在第一次调用完成之前结束,这反过来又终止了进程。允许第一个调用完成的唯一方法是放置一个 await Task.Delay()
行来实现这一点。
我明白它为什么这样做了,因为我已经有效地挂断了电话,没有期待回复。我不想开始使用任务延迟,我确信这只是我缺乏理解,这就是异步编程的问题:o)。
最佳答案
您需要捕获启动 QueueProcessor
的 Task
并在第二次调用 stub 后等待它:
public async Task FooTestAsync()
{
var task = Task.Run(() => stubbedQueueHandler.QueueProcessor(setupModel));
await Task.Delay(2000);
stubbedQueueHandler.QueueProcessor(setupModel);
await task;
}
这样,您可以确保在操作完成之前完成操作,因为 QueueProcessor
将同步阻塞直到其操作完成。
关于c# - 单元测试和多个异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33634375/