我将创建一个新的Xamarin应用程序,并由于客户的需求,我需要在几乎所有内容上创建单元测试。
在我的应用程序中,我正在使用HttpClient,并且必须设置Timeout,因为该应用程序必须上传图像。但是,如何为HttpClient.Timeout创建单元测试?
除此之外,其他所有内容都是使用HttpMessageHandler模拟的,但是在其中插入Task.Delay对其没有影响。
编辑 添加了代码以澄清。
在我的应用程序中,我正在使用HttpClient,并且必须设置Timeout,因为该应用程序必须上传图像。但是,如何为HttpClient.Timeout创建单元测试?
除此之外,其他所有内容都是使用HttpMessageHandler模拟的,但是在其中插入Task.Delay对其没有影响。
编辑 添加了代码以澄清。
public async Task ExecuteAsync_NotExecutedWithinTimeout_ThrowsExecption()
{
// Arrange
var endpoint = "http://google.dk/";
var method = HttpMethod.Get;
var timeoutClient = TimeSpan.FromMilliseconds(2);
var timeoutServer = TimeSpan.FromMilliseconds(10);
var requestor = new Requestor(new MessageHandler { Method = HttpMethod.Get, Timeout = timeoutServer, URL = url });
bool result = false;
// Act
try
{
await requestor.ExecuteAsync(method, endpoint, timeout: timeoutClient);
}
catch (TimeoutException)
{
result = true;
}
// Assert
Assert.AreEqual(true, result);
}
class MessageHandler : HttpMessageHandler
{
public TimeSpan? TimeOut { get; set; }
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (Timeout.HasValue)
await Task.Delay(Timeout.Value);
return new HttpResponseMessage(System.Net.HttpStatusCode.OK);
}
}
class Requestor
{
public async Task<string> ExecuteAsync(HttpMethod httpMethod, string endpoint, TimeSpan? timeout = default(TimeSpan?))
{
using (var client = GetHttpClient())
{
if (timeout.HasValue)
{
client.Timeout = timeout.Value;
}
var response = await client.GetAsync(endpoint);
}
}
}
private HttpClient GetHttpClient()
{
var client = _messageHandler == null ? new HttpClient() : new HttpClient(_messageHandler, false);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return client;
}