【发布时间】:2012-05-22 21:42:41
【问题描述】:
我正在运行一套使用System.Net.HttpClient 的集成测试。我们在这些测试中的大部分“行为”部分都使用这种通用格式:
// Arrange
// Do some stuff
// Act
var download = _client
.GetStringAsync(testUrl)
.Result;
// Assert
// Does "download" contain what I expected?
但是,间歇性地运行这些测试会产生如下结果:
System.AggregateException : One or more errors occurred.
----> System.Threading.Tasks.TaskCanceledException : A task was canceled.
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task`1.get_Result()
我意识到使用 HttpClient 是为了启动异步操作,并不适合我们总是告诉它等待的集成测试场景。所以这让我想到了两个有点相关的问题:
- 使用
HttpWebRequest/HttpWebResponse是否更适合这种情况? - 即使是这样,使用
HttpClient处理异步启动的请求错误的最佳方式是什么?
【问题讨论】:
-
一开始为什么要异步执行此操作?似乎您想同步进行...所以我对问题#1说是。对于问题 #2,我会增加 HttpClient 类的
Timeout属性,除非您需要在特定时间范围内测试响应能力。无论哪种方式,我都不确定为什么 async 更适合单元测试...... -
Httpclient 只提供异步方法。 OP 通过在任务上调用 Result 将它们正确地转换为同步调用。严格来说,这也意味着这不是异步异常,它是在阻塞“结果”后引发的同步异常。我会尝试增加超时时间
标签: c# unit-testing asynchronous dotnet-httpclient