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.