我有一个从网络下载大量pdf的应用程序。我不时收到HttpRequestException,包含以下消息:将内容复制到流时出错。
因此,我正在尝试对我的代码进行单元测试以处理这种情况。我当前的下载代码是:
var request = await httpClient.GetAsync(url);
// This is where the exception would be thrown
await request.Content.ReadAsByteArrayAsync());
现在,我正在尝试模拟HttpRequestException,以便可以对上面的代码进行单元测试,但是我不知道该怎么做。谁能帮忙吗?
提前致谢!
最佳答案
此处的关键是创建一个引发异常的HttpContent
:
public class ExceptionThrowingContent : HttpContent
{
private readonly Exception exception;
public ExceptionThrowingContent(Exception exception)
{
this.exception = exception;
}
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
return Task.FromException(exception);
}
protected override bool TryComputeLength(out long length)
{
length = 0L;
return false;
}
}
一旦有了,就可以使用我自己的mockhttp之类的东西来模拟请求:
var handler = new MockHttpMessageHandler();
handler.When("http://tempuri.org/url")
.Respond(new ExceptionThrowingContent(ex));
var mockClient = new HttpClient(handler);
// pass mockHandler to your component
现在,如果您的组件在发出请求时传递了
HttpCompletionOption.ResponseHeadersRead
,则将在await Content.ReadAsByteArrayAsync()
处引发异常。如果不是,则HttpClient将尝试缓冲响应,因此将在await HttpClient.GetAsync()
处引发异常。如果响应被缓冲,则在
ReadAsByteArrayAsync
上抛出异常实际上是“不可能的”,因此尝试模拟它毫无意义。 (OutOfMemoryException
之外的“不可能”)