Eu tenho um serviço da web que estou tentando fazer teste de unidade. No serviço, ele puxa vários valores do HttpContext
mesmo modo:
m_password = (string)HttpContext.Current.Session["CustomerId"];
m_userID = (string)HttpContext.Current.Session["CustomerUrl"];
no teste de unidade, estou criando o contexto usando uma simples solicitação de trabalho, como:
SimpleWorkerRequest request = new SimpleWorkerRequest("", "", "", null, new StringWriter());
HttpContext context = new HttpContext(request);
HttpContext.Current = context;
No entanto, sempre que tento definir os valores de HttpContext.Current.Session
HttpContext.Current.Session["CustomerId"] = "customer1";
HttpContext.Current.Session["CustomerUrl"] = "customer1Url";
Eu recebo uma exceção de referência nula que diz que HttpContext.Current.Session
é nula.
Existe alguma maneira de inicializar a sessão atual dentro do teste de unidade?
Respostas:
Tivemos que zombar
HttpContext
usando aeHttpContextManager
ligando para a fábrica de dentro do nosso aplicativo, bem como os testes de unidadeVocê substituiria todas as chamadas
HttpContext.Current
porHttpContextManager.Current
e teria acesso aos mesmos métodos. Então, quando você estiver testando, também poderá acessarHttpContextManager
e zombar de suas expectativasEste é um exemplo usando o Moq :
e, em seguida, para usá-lo em seus testes de unidade, eu chamo isso no meu método Test Init
você pode, no método acima, adicionar os resultados esperados da sessão que você espera estar disponíveis para o seu serviço da web.
fonte
HttpContextManager
seria um nome melhor do que,HttpContextSource
mas concordo queHttpContextFactory
é enganoso.Você pode "fingir" criando um novo
HttpContext
como este:http://www.necronet.org/archive/2010/07/28/unit-testing-code-that-uses-httpcontext-current-session.aspx
Eu peguei esse código e o coloquei em uma classe auxiliar estática da seguinte forma:
Ou, em vez de usar a reflexão para construir a nova
HttpSessionState
instância, basta anexáHttpSessionStateContainer
-la aoHttpContext
(como no comentário de Brent M. Spell):e então você pode chamá-lo em seus testes de unidade, como:
fonte
Server.MapPath()
não funcionará se você usar isso também.A solução Milox é melhor que a aceita um IMHO, mas tive alguns problemas com essa implementação ao lidar com URLs com querystring .
Fiz algumas alterações para fazê-lo funcionar corretamente com quaisquer URLs e evitar o Reflection.
fonte
httpContext.Session
, alguma idéia de como fazer o mesmohttpContext.Application
?Eu torço algo sobre isso há um tempo atrás.
Teste de unidade HttpContext.Current.Session no MVC3 .NET
Espero que ajude.
fonte
Se você estiver usando a estrutura MVC, isso deve funcionar. Eu costumava da Milox FakeHttpContext e acrescentou algumas linhas de código adicionais. A ideia veio deste post:
http://codepaste.net/p269t8
Isso parece funcionar no MVC 5. Não tentei isso nas versões anteriores do MVC.
fonte
Você pode tentar o FakeHttpContext :
fonte
No asp.net Core / MVC 6 rc2, você pode definir o
HttpContext
o rc 1 era
https://stackoverflow.com/a/34022964/516748
Considere usar
Moq
fonte
A resposta que funcionou comigo é o que @Anthony havia escrito, mas você precisa adicionar outra linha que seja
então você pode usar isso:
fonte
Tente o seguinte:
E adicione a classe:
Isso permitirá que você teste com a sessão e o cache.
fonte
Eu estava procurando algo um pouco menos invasivo do que as opções mencionadas acima. No final, eu vim com uma solução brega, mas isso pode fazer algumas pessoas se moverem um pouco mais rápido.
Primeiro, criei uma classe TestSession :
Em seguida, adicionei um parâmetro opcional ao construtor do meu controlador. Se o parâmetro estiver presente, use-o para manipulação de sessão. Caso contrário, use o HttpContext.Session:
Agora eu posso injetar minha TestSession no controlador:
fonte
Nunca zombe .. nunca! A solução é bem simples. Por que fingir uma criação tão bonita como
HttpContext
?Empurre a sessão para baixo! (Apenas esta linha é suficiente para a maioria de nós entender, mas explicada em detalhes abaixo)
(string)HttpContext.Current.Session["CustomerId"];
é como acessamos agora. Mude paraQuando chamado do teste, _customObject usa armazenamento alternativo (valor da chave do banco de dados ou nuvem [ http://www.kvstore.io/] )
Mas quando chamado a partir do aplicativo real,
_customObject
usaSession
.como isso é feito? bem ... Injeção de Dependência!
Portanto, o teste pode definir a sessão (subterrânea) e, em seguida, chamar o método de aplicação como se não soubesse nada sobre a sessão. Em seguida, teste secretamente verifica se o código do aplicativo atualizou corretamente a sessão. Ou se o aplicativo se comportar com base no valor da sessão definido pelo teste.
Na verdade, acabamos zombando, embora eu tenha dito: "nunca zombe". Como não podíamos deixar de passar para a próxima regra, "zombe de onde dói menos!". Zombando imenso
HttpContext
ou zombando de uma pequena sessão, o que dói menos? não me pergunte de onde essas regras vieram. Vamos apenas dizer bom senso. Aqui está uma leitura interessante sobre não zombar, pois o teste de unidade pode nos matarfonte
A resposta que o @Ro Hit deu me ajudou muito, mas estava faltando as credenciais do usuário porque tive que falsificar um usuário para testar a unidade de autenticação. Portanto, deixe-me descrever como eu o resolvi.
De acordo com isso , se você adicionar o método
e depois acrescentar
até a última linha do
TestSetup
método, as credenciais do usuário são adicionadas e prontas para serem usadas no teste de autenticação.Também notei que existem outras partes no HttpContext que você pode precisar, como o
.MapPath()
método Existe um FakeHttpContext disponível, que é descrito aqui e pode ser instalado via NuGet.fonte
Encontrei a seguinte solução simples para especificar um usuário no HttpContext: https://forums.asp.net/post/5828182.aspx
fonte
Tente assim ..
fonte