我想测试我的服务代理类,该类正在调用MVC WebApi并返回JSON响应。
public class CarServiceProxy
{
public CarsCollection GetCars()
{
CarsCollection cars = new CarsCollection();
string api = "api/Car/GetCars";
var response = httpClient.GetAsync(api).Result;
if (response.IsSuccessStatusCode)
{
cars = response.Content.ReadAsAsync<CarsCollection >().Result;
}
return cars;
}
}
那么我的 MVC 网站控制器类调用上述代理类为:
public ActionResult Index()
{
CarsCollection cars = this.carsServiceProxy.GetCars();
return View(cars);
}
现在为了单独测试两者,我可以使用最小起订量和模拟carServiceProxy来测试我的控制器,并在测试中使用一些虚假数据伪造CarsCollection。到目前为止,我还可以。
但是,如何使用最小起订量测试代理类来模拟 API 响应 (JSON)?我想我确实需要测试,因为 JSON 到 C# 的转换形式发生在该类中,如果有人更改我的模型 CarsCollection,这可能会中断。所以我确实需要测试代理类。
您需要为客户端创建一个"假"HTTP 处理程序。 通过这种方式,您可以准确控制返回的 HTTP 响应。 您可以在构造 HTTP 客户端时注入 HTTP 处理程序。
对于测试,我通常使用内部构造函数进行测试,它接受 HTTP 处理程序。 这样,我可以轻松地测试使用假处理程序使用 HTTP 客户端的类。 如果采用此方法,并且单元测试位于单独的程序集中,则需要将以下内容添加到目标项目的 AssemblyInfo.cs:
[assembly: InternalsVisibleTo("NameSpace.MyUnitTestProject")]
假处理程序:
public class FakeHttpMessageHandler : HttpMessageHandler
{
private HttpResponseMessage _response;
public FakeHttpMessageHandler(HttpResponseMessage response)
{
_response = response;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var responseTask = new TaskCompletionSource<HttpResponseMessage>();
responseTask.SetResult(_response);
return responseTask.Task;
}
}
然后使用(可能希望在此处使用 JSON 序列化帮助程序):
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent(@"{'Cars':[{'Name':'BMW'}]");
var handler = new FakeHttpMessageHandler(response);
var client = new HttpClient(handler);
// client.GetAsync().result will return the response
您可以更改 httpClient.GetAsync(api)。结果部分是可移动和可测试的,以测试代理类。换句话说,您可以使代码独立于HTTP请求响应,而只处理JSON数据进行测试。