【发布时间】:2012-11-26 18:21:41
【问题描述】:
在我尝试学习和理解 WebAPI 的过程中,我想我已经了解到 APIController 方法的返回值被包装到 HttpResponseMessage 中。
您还可以选择创建一个新的 HttpResponseMessage 并将您的 List<Product> 放入其中。
例如,我对测试标头感兴趣,如果我使用以下代码传入接受标头,我想测试响应中返回的内容类型。
我知道我总是可以返回一个 HttpResponseMessage,因为严格来说这就是它的作用,但我只是想知道是否有一种方法可以将控制器方法中的响应转换为 HttpResponseMessage 而无需创建 HttpServer/HttpConfiguration 设置为显示here。
var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var route = config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}"
);
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "GetData" } });
var controller = new GetDataController();
controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
/************************* HELP!!!***************/
// If Get returns List<Product> can I cast it as HttpResponseMessage??
/************************************************/
var result = controller.Get();
// Assert
Assert.Equal("application/json", result.Content.Headers.ContentType.MediaType);
【问题讨论】:
-
您是在尝试通过创建独立服务器并按照 Despertar 的建议发送实际的 HTTP 请求来创建集成测试,还是在创建单元测试以直接检查您的控制器代码?
-
嗯,我希望我能做到,这样就可以在没有 HttpServer 的情况下调用它并获得有效的 HTTP 响应
-
你需要一个正在运行的控制器实例,然后正如 Despertar 所建议的那样。
-
因为只有在被有效的 HTTP 请求调用时才会正确填充响应?
标签: c# .net asp.net-mvc asp.net-web-api