ASP.NET WebApiunit testing与Request.CreateResponse
我试图为我的ApiController编写一些unit testing,并面临一些问题。 有一个很好的扩展方法,称为Request.CreateResponse,有助于生成响应很多。
public HttpResponseMessage Post(Product product) { var createdProduct = repo.Add(product); return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct); }
有没有办法嘲笑CreateResponse不使用部分模拟或直接使用“新的HttpResponseMessage(…)”?
解决这个问题的另一种方法是执行以下操作:
controller.Request = new HttpRequestMessage(); controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
如果你升级到webapi 5.0,那么你需要将其更改为:
controller.Request = new HttpRequestMessage(); controller.Request.SetConfiguration(new HttpConfiguration());
您需要这样做的原因是因为您必须在控制器上填充Request
,否则Request
上的扩展方法将不起作用。 您还必须在请求上设置HttpConfiguration
,否则路由和pipe道的其他部分将无法正常工作。
你可以像这样设置控制器对象的可testing性:
var config = new HttpConfiguration(); var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products"); var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"); var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } }); controller.ControllerContext = new HttpControllerContext(config, routeData, request); controller.Request = request; controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
复制Peter Provost关于unit testingASP.NET Web API的综合博客文章。
WebAPI 1在这里与使用VB类似的问题。
我设法在这里混合回应,以使其工作如此简单:
Dim request As HttpRequestMessage = New HttpRequestMessage() Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration)
只是张贴,以防万一它帮助任何人。