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.