2012-06-03 29 views
126

Estoy intentando 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.Prueba de unidad ASP.NET WebApi con Request.CreateResponse

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

¿Hay alguna manera de burlarse CreateResponse sin utilizar de los simulacros parciales o usando directa de la "nueva HttpResponseMessage (...)"?

+1

¿Por qué quiere burlarse del 'CreateResponse'? ¿Por qué no afirmar en las propiedades devueltas 'HttpResponseMessage'' Content' y 'StatusCode' que se han establecido los valores correctos? – nemesv

+3

Si ejecuto este método desde pruebas unitarias, fallará, salvo que la configuración no está configurada. – asa

+1

Bien, lástima de mí, solo necesitaba escribir esto.Request.CreateResponse (HttpStatusCode.Accepted, createdProduct, GlobalConfiguration.Configuration) – asa

Respuesta

215

Otra manera de resolver esto es para hacer lo siguiente:

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

Si va a actualizar a 5.0 WebAPI, entonces tendrá que cambiar esto a:

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

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

+0

Sí, eso podría funcionar también, pero parece que Request.CreateResponse también funciona. – asa

+4

Añadiendo GlobalConfiguration.Configuration aún la solicitud de solicitud null. Configurar la solicitud funcionó para mí, sin embargo, este no fue el final de mis problemas ya que mi acción también llamaba a Url.Link y el nombre de la ruta no estaba definido. – foolshat

+0

Ayuda para configurar la ruta http://stackoverflow.com/questions/11779311/testing-webapi-controller-url-link – foolshat

20

Se puede configurar el objeto controlador de la capacidad de prueba como esta:

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 del blog integral de Peter Provost en Unit Testing ASP.NET Web API.

0

WebAPI 1 aquí con un problema similar con VB.

que lograron respuestas híbridos aquí para conseguir que esto funcione tan simple como esto:

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

simple publicación en caso de que ayuda a nadie.

0

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());