如何使用System.Net.Http.HttpClient处理异步异常并进行集成测试?

Bra*_*ton 9 c# unit-testing asynchronous dotnet-httpclient

我正在运行一套使用的集成测试System.Net.HttpClient.这些测试中的大多数"行为"部分都使用这种通用格式:

// Arrange
// Do some stuff

// Act
var download = _client
    .GetStringAsync(testUrl)
    .Result;

// Assert
// Does "download" contain what I expected?
Run Code Online (Sandbox Code Playgroud)

但是,间歇性地运行这些测试会产生如下所示:

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()
Run Code Online (Sandbox Code Playgroud)

我意识到使用HttpClient是用于启动异步的东西,并不适合我们总是告诉它等待的集成测试场景.所以这引出了两个有些相关的问题:

  1. 是否正在使用HttpWebRequest/ HttpWebResponse更适合此方案?
  2. 即使是这样HttpClient,处理异常启动的请求错误的最佳方法是什么?

Mic*_*ltu 4

正如之前的评论者所建议的,您的连接可能超时。_client.Timeout = timeoutInMilliseconds您可以在进行 GetStringAsync 调用之前设置超时。但是,如果当前是默认值(100 秒),那么我的猜测是,当发生这种情况时,您正在测试的远程服务器实际上已关闭。

有关超时属性的更多信息,请访问:http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout.aspx