【发布时间】:2016-08-14 20:27:07
【问题描述】:
我尝试为 UWP 客户端进行单元测试 REST 通信逻辑。参考the answer for System.Web.HttpClient,发现Windows.Net.HttpClient也接受了一个叫IHttpFilter的说法。
所以,我尝试使用 IHttpFilter 进行自定义响应,但我不知道做出响应的正确方法。
public class TestFilter : IHttpFilter
{
public IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage request)
{
if (request.Method == HttpMethod.Get)
{
// response fake response for GET...
}
}
public void Dispose()
{
// do nothing
}
}
单元测试的目标方法如下。
public async Task<string> PostResult(HttpClient httpClient, string username)
{
var json = new JsonObject
{
{"Username",
JsonValue.CreateStringValue(string.IsNullOrEmpty(username) ? CommonKey.UnAuthorizedUserPartitionKey : username)
},
};
var content = new HttpStringContent(json.Stringify());
content.Headers.ContentType = new HttpMediaTypeHeaderValue("application/json");
// I want to make below line testable...
var response = await httpClient.PostAsync(new Uri(Common.ProcessUrl), content);
try
{
response.EnsureSuccessStatusCode();
return null;
}
catch (Exception exception)
{
return exception.Message ?? "EMPTY ERROR MESSAGE";
}
}
请注意,这不是与 System.Web.HttpClient 模拟/伪造相关的重复问题。我要问的是Windows.Web.HttpClient。我没能用它实现。
请注意,Windows.Web.Http.IHttpClient 是内部可访问的,HttpClient 是密封的。很难做 Mock 或继承并覆盖它。
【问题讨论】:
-
为什么不取消对
HttpClient的整个直接调用,并在抽象背后公开所需的功能。您正在给自己不必要的工作(恕我直言)。 -
正确。我有点乱 :( 我将目标方法附加到测试。
-
@Nkosi // 不,我想要 Windows.Web.HttpClient 中的
IHttpFilter,而不是理论上的基于 System.Web.HttpClient 的模拟/伪造。如果您编写 UWP 代码,它会有些不同,需要进行一些试验。不过我失败了。 -
@Nkosi // 请移除关闭请求。我的问题不是重点。
标签: c# unit-testing win-universal-app