Como testar unitariamente um método que recebe um FormCollection para fazer upload de um arquivo?
-
22-09-2019 - |
Pergunta
Quero testar a unidade de um método como o seguinte:
public ActionResult StoreFile(FormCollection form, string _paginaAtual)
{
Session["MySession"] = 1
if (Request.Files["uploadedFiles"] != null)
{
//do something about the file
}
return View()
}
Está dentro da minha classe de controlador "SomeController.cs" e é chamado quando o usuário envia um arquivo em uma entrada HTML simples de input type="file".
P.S.:Puristas, cuidado:SEI que este não é um teste de unidade "puro", só quero chamar o método em um ambiente de teste e verificar se ele faz as alterações desejáveis no sistema.
Obrigado a todos por qualquer luz no assunto, Lynx.
Solução
Felizmente, a equipe do ASP.Net pensou sobre isso antes de começar no MVC e criar o namespace System.Web.Abstractions.É uma série de classes base que espelham as classes estáticas que são impossíveis de testar tradicionalmente como a classe HttpWebRequest.
O que você quer fazer é confiar em uma dessas classes base e fazer um pouco de injeção de dependência para simular efetivamente sua sessão.
HttpSessionStateBase _session;
public HttpSessionStateBase Session
{
get{
return _session ?? (_session = new HttpSessionStateWrapper(HttpContext.Current.Session));
}
set{
_session = value;
}
}
Quanto ao FormCollection, você não precisa zombar dele, pois poderá criar um além de um HttpContext.Há um bom exemplo disso em Blog de Marcus Hammarberg.
Outras dicas
O que você está descrevendo parece mais um teste de integração.Quanto ao seu FormCollection, se você quiser isolá-lo, poderá usar uma estrutura de isolamento como o RhinoMocks ou "rolar manualmente" sua própria simulação para ele.