gpt4 book ai didi

c# - 模拟 HttpRequestException 进行单元测试

转载 作者:行者123 更新时间:2023-11-30 16:00:59 25 4
gpt4 key购买 nike

我有一个可以从网上下载大量 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 之外)

关于c# - 模拟 HttpRequestException 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com