0

我在 mvc4 中创建了一个简单的 web api 控制器,其中包含 4 个方法(每个 CRUD 操作一个)。我可以使用 fiddler 来测试我的控制器中的方法是否有效。

我现在正在尝试进行单元测试以证明这些工作。我已经设法将我的客户端对象序列化为 json 格式,但是现在我如何使用这个 json 字符串来实际调用我的方法?

如果有帮助,我将使用 Json.NET 来序列化我的客户端对象——尽管我认为这个扩展实际上并没有处理它到服务器的传递和检索。

4

3 回答 3

1

您的单元测试应该针对控制器编写 - 因此您不需要发出实际的 HTTP 请求来对您的 Web API 代码进行单元测试,您只需调用这些方法。

从设计的角度来看,如果你想要一个宁静的 Web API,客户端应该能够发送标准的 HTTP 消息,而无需序列化请求。

于 2012-11-14T19:51:58.313 回答
0

nick_w此处提供的代码是正确的。你需要使用HttpClient对象。正如史蒂夫芬顿所提到的,要创建单元测试,您不想这样做 - 而是直接针对控制器进行测试。但是对于功能测试,您可以做到。我做过同样的事情。我已经创建了辅助类,所以我只需要调用 Http 辅助方法之一,这取决于我所做的是 GET 还是 POST 等。该帮助程序使用泛型类型,因此它可以处理任何传递的类型。

于 2012-11-14T22:16:14.583 回答
0

这是我用来将对象发布到 restful Web API 的那种方法:

HttpResponseMessage response;
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://url_to_service");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var responseTask = client.PostAsJsonAsync("api/resource/somethingelse", someObjectToPost).Result;
responseTask.Wait();
response = responseTask.Result;

if (response.IsSuccessStatusCode)
{
    var contentTask = response.Content.ReadAsAsync<SomeResponseType>();
    contentTask.Wait();
    SomeResponseType responseContent = contentTask.Result;
}
else
{
    //Handle error.
}

在这种情况下,someObjectToPost是您的客户端对象,尽管您可以将它留给 Web API 为您序列化它。在上面的示例中,我假设响应是虚构的类型-如果响应预期是纯文本,SomeResponseType您也可以使用。ReadAsStringAsync

于 2012-11-14T20:24:44.990 回答