如何在客户端 MVC 客户端项目中模拟 WepAPi 响应 (JSON)



我想测试我的服务代理类,该类正在调用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数据进行测试。

最新更新