我有一个从网络下载大量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之外的“不可能”)

10-05 21:02
查看更多