ASP.NET Pruebas unitarias WebAPI con Solicitud.CreateResponse


Estoy tratando de escribir algunas pruebas unitarias para mi ApiController y me enfrenté a algunos problemas. Hay un buen método de extensión llamado Request.CreateResponse que ayuda mucho a generar respuesta.

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

¿Hay alguna manera de simular CreateResponse sin usar simulaciones parciales o el uso directo de " new HttpResponseMessage (...)"?

Author: abatishchev, 2012-06-03

4 answers

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, entonces necesitará cambiar esto a:

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

La razón por la que necesita hacer esto es porque tiene que tener Request rellenado 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 canalización no funcionarán correctamente.

 228
Author: jonnii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-20 08:31:01

Puede configurar el objeto controlador para la capacidad de prueba de la siguiente 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 completa del blog de Peter Provost sobre Pruebas unitarias ASP.NET Web API .

 23
Author: mono68,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-20 08:58:21

WebAPI 1 aquí con un problema similar usando VB.

Me las arreglé para respuestas híbridas aquí para hacer que esto funcione tan simple como esto:

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

Solo publicando en caso de que ayude a alguien.

 0
Author: Rudy Scoggins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 15:34:19

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

customerController.Request = new HttpRequestMessage();
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
 0
Author: Kiran Chaudhari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-12 16:44:26