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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top