9

我正在运行一套使用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()

我意识到 usingHttpClient是为了启动异步操作,并不适合我们总是告诉它等待的集成测试场景。所以这让我想到了两个有点相关的问题:

  1. 使用HttpWebRequest/HttpWebResponse更适合这种情况吗?
  2. 即使是这样,HttpClient处理异步启动的请求错误的最佳方法是什么?
4

2 回答 2

4

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

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

于 2013-09-21T19:09:22.013 回答
1

System.AggregateException来自同步运行的任务中发生的异常。使用异步测试允许运行器(在我的例子中是 NUnit)分解任务并获取真正的异常。所以上面的代码应该是这样的:

[Test]
public async Task DownloadContainsWhatIExpected()
{
    // Arrange
    // Do some stuff

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

    // Assert
    // Does "download" contain what I expected?
}

在方法签名中使用async Task,然后await在异步调用中使用是执行这类测试的最佳方式。

于 2014-11-14T21:24:04.157 回答