visual unit test studio net asp apicontroller c# unit-testing asp.net-web-api mocking httpresponse

c# - unit - Prueba de unidad ASP.NET WebApi con Request.CreateResponse



unit test rest api c# (4)

Intento escribir algunas pruebas de unidad para mi ApiController y tuve que enfrentar algunos problemas. Hay un buen método de extensión llamado Request.CreateResponse que ayuda mucho con la generación de respuestas.

public HttpResponseMessage Post(Product product) { var createdProduct = repo.Add(product); return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct); }

¿Hay alguna forma de burlarse de CreateResponse sin utilizar los simulacros parciales o el uso directo de "new HttpResponseMessage (...)"?


En su clase de prueba, cree una instancia de la clase de controlador. por ejemplo var customerController= new CustomerController();

customerController.Request = new HttpRequestMessage(); customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());


Otra forma de resolver esto es hacer lo siguiente:

controller.Request = new HttpRequestMessage(); controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());

Si está actualizando a webapi 5.0, deberá cambiar esto a:

controller.Request = new HttpRequestMessage(); controller.Request.SetConfiguration(new HttpConfiguration());

La razón por la que necesita hacer esto es porque debe tener una Request rellenada en el controlador; de lo contrario, los métodos de extensión en la Request no funcionarán. También debe tener un HttpConfiguration configurado en la Solicitud; de lo contrario, el enrutamiento y otras partes de la tubería no funcionarán correctamente.


Puede configurar el objeto del controlador para la prueba de esta manera:

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;

Copiado de la publicación integral del blog de Peter Provost en Unit Testing ASP.NET Web API .


WebAPI 1 aquí con un problema similar usando VB.

Logré respuestas híbridas aquí para hacer que esto funcione de esta manera:

Dim request As HttpRequestMessage = New HttpRequestMessage() Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration)

Solo publicando en caso de que ayude a alguien.