我在 mvc4 中创建一个简单的 web api 控制器,其中包含 4 个方法(每个 CRUD 操作一个)。我能够使用小提琴手来测试控制器中的方法是否有效。
我现在正在尝试进行单元测试以证明这些工作。我已经设法将我的客户端对象序列化为 json 格式,但现在如何使用这个 json 字符串来实际调用我的方法?
如果有帮助,我正在使用 Json.NET 来序列化我的客户端对象 - 尽管我认为此扩展实际上并不处理将其交付和检索到服务器。
单元测试应该针对控制器编写 - 因此无需发出实际的 HTTP 请求来对 Web API 代码进行单元测试,只需调用方法即可。
从设计的角度来看,如果你想要一个 restful Web API,客户端应该能够发送标准 HTTP 消息,而不必序列化请求。
这是我用来将对象发布到 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
。
nick_w 这里提供的代码是正确的。您需要使用HttpClient
对象。正如 Steve Fenton 所提到的,要创建单元测试,您不想这样做 - 而是直接针对控制器进行测试。但是对于功能测试,您可以做到。我也做过同样的事情。我已经创建了帮助程序类,所以我只需要调用 Http 帮助程序方法之一,具体取决于我做的是 GET 还是 POST 等。此帮助程序使用泛型类型,因此它与传递的任何类型一起运行。