c# - 单元测试和多个异步任务

标签 c# asp.net asynchronous asp.net-web-api async-await

我正在创建单元测试以协助构建一些代码,这些代码将接受并排队(如果需要)来 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)。

最佳答案

您需要捕获启动 QueueProcessorTask 并在第二次调用 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/

相关文章:

javascript - 设置默认 .aspx 页面访问?

c# - 将文本从文本框保存到内存流?

c# - 计算字节数组中位和的最快方法

c# - 当路径超过 260 个字符时出现 System.IO.DirectoryNotFoundException

asp.net - 允许双 URL 编码的请求路径有效

c# - ASP.NET WebApi 中的即发即弃和单向调用

ios - 函数类型作为参数类型,如何更改此函数中的 UI 元素值?

Node.js 异步映射限制和内存

c# - 无法通过 Exchange Server 2013 中的 EWS 加载 MimeContent

c# - ASP.NET Web Api 2 通过 Id 获取