Como unidad de prueba un método que recibe una FormCollection para cargar un archivo?
-
22-09-2019 - |
Pregunta
Quiero Unidad de prueba de un método como el siguiente:
public ActionResult StoreFile(FormCollection form, string _paginaAtual)
{
Session["MySession"] = 1
if (Request.Files["uploadedFiles"] != null)
{
//do something about the file
}
return View()
}
Es dentro de mi clase controlador "SomeController.cs" y que se llama cuando se somete usuario un archivo en un simple input type = "archivo" de entrada HTML.
P.S .: puristas cuidado:. Sé que esto no es una prueba de la unidad "puro", sólo quiero llamar al método en un entorno de prueba y comprobar si hace cambios deseables en el sistema de
Gracias a todos por cualquier luz en el tema, Lynx.
Solución
Por suerte el equipo ASP.Net pensó en esto antes de que comenzaran en MVC y crean el espacio de nombres System.Web.Abstractions. Se trata de una serie de clases base que reflejan las clases estáticas que son imposibles de prueba tradicionalmente como la clase HttpWebRequest.
Lo que queremos hacer es confían en una de esas clases base y hacer un poco de inyección de dependencias con el fin de burlarse de manera efectiva su sesión.
HttpSessionStateBase _session;
public HttpSessionStateBase Session
{
get{
return _session ?? (_session = new HttpSessionStateWrapper(HttpContext.Current.Session));
}
set{
_session = value;
}
}
En cuanto a la FormCollection, usted no tiene que burlarse de él, ya que debe ser capaz de crear un aparte de una HttpContext. Hay un buen ejemplo de ello en el blog de Marcus Hammarberg .
Otros consejos
Lo que usted describe suena más como pruebas de integración. En cuanto a su FormCollection, si desea aislarla, se puede utilizar un marco como el aislamiento RhinoMocks, o "mano roll" su propio simulacro para ello.