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) 

只是张贴,以防万一它帮助任何人。