0

我想测试调用 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 WebSite 控制器类将上述代理类称为:

public ActionResult Index()
{
    CarsCollection cars = this.carsServiceProxy.GetCars();
    return View(cars);
}

现在要单独测试两者,我可以使用 MOQ 和模拟 carServiceProxy 来测试我的控制器,并在我的测试中使用一些假数据来伪造 CarsCollection。到目前为止我还好。

但是,如何使用 MOQ 测试代理类来模拟 API 响应 (JSON)?我认为我确实需要测试,因为 JSON 到 C# 的转换发生在该类中,如果有人更改了我的模型 CarsCollection,那可能会中断。所以我确实需要测试代理类。

4

2 回答 2

1

您将要为您的客户端创建一个“假”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
于 2013-09-25T04:05:05.757 回答
0

您可以将 httpClient.GetAsync(api).Result 部分更改为 moackable 和 testable 以测试代理类。换句话说,您可以使您的代码独立于 HTTP 请求响应,并且只使用 JSON 数据进行测试。

于 2013-09-19T10:49:03.627 回答