Saltar al contenido

¿Está probando un método de API web que usa HttpContext.Current.Request.Files?

Solución:

La API web se ha creado para admitir pruebas unitarias al permitirle simular varios objetos de contexto. Sin embargo, al usar HttpContext.Current estás usando “estilo antiguo” System.Web código que usa el HttpContext class, lo que hace que sea imposible realizar una prueba unitaria de su código.

Para permitir que su código sea comprobable por unidades, debe dejar de usar HttpContext.Current. En Envío de datos de formularios HTML en ASP.NET Web API: Carga de archivos y MIME de varias partes, puede ver cómo cargar archivos utilizando Web API. Irónicamente, este código también usa HttpContext.Current para tener acceso a la MapPath pero en la API web deberías usar HostingEnvironment.MapPath que también funciona fuera de IIS. Burlarse del último también es problemático, pero por ahora me centraré en su pregunta sobre burlarse de la solicitud.

No usando HttpContext.Current le permite realizar una prueba unitaria de su controlador asignando el ControllerContext propiedad del controlador:

var content = new ByteArrayContent( /* bytes in the file */ );
content.Headers.Add("Content-Disposition", "form-data");
var controllerContext = new HttpControllerContext {
  Request = new HttpRequestMessage {
    Content = new MultipartContent { content }
  }
};
var controller = new MyController();
controller.ControllerContext = controllerContext;

La respuesta aceptada es perfecta para la pregunta del OP. Quería agregar mi solución aquí, que se deriva de la de Martin, ya que esta es la página a la que me dirigieron cuando simplemente buscaba cómo simular el objeto Solicitud para la API web para poder agregar encabezados que mi controlador está buscando. Tuve dificultades para encontrar la respuesta simple:

   var controllerContext = new HttpControllerContext();
   controllerContext.Request = new HttpRequestMessage();
   controllerContext.Request.Headers.Add("Accept", "application/xml");

   MyController controller = new MyController(MockRepository);
   controller.ControllerContext = controllerContext;

Y ahí estás; una forma muy sencilla de crear un contexto de controlador con el que puede “simular” el objeto de solicitud y proporcionar los encabezados correctos para su método de controlador.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *