這裏的關鍵是建立一個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
之外的「不可能」)
摘要您控制的接口後面的httpClient調用,以便您可以在單元測試期間模擬它以提升/模擬所需的異常。從命名角度來看,'GetAsync'的結果將是'response'而不是'request'。即'var response = await httpClient.GetAsync(url);' – Nkosi
我沒有考慮過這個用例。我會考慮在mockhttp中添加一個新的API,以便將來更輕鬆。 –
謝謝。請儘可能更新。 –