Posted on novembro 14, 2020
Simular uma request com HttpSimulator
De uns tempo pra cá, eu assumo que virei uma viciadinha em testes automatizados (estou atrasada nessa tendência, eu sei). Sempre que eu tenho a oportunidade de colocar um projetinho de testes em algum lugar, eu ponho, e cada dia aprendo um pouquinho mais e melhoro minha técnica. Esses dias, encontrei um empecilho no caminho que poderia colocar grande parte dos meus testes em risco, mas felizmente eu rapidinho encontrei uma solução fácil para o meu problema. Hoje, eu queria falar sobre como simular uma request com o HttpSimulator, desenvolvido pelo Phil Haack do You’ve Been Haacked.
Qual era o problema?
O problema era bem simples, mas bem… eu sou mestra em tornar meus problemas simples em coisas horrendas 😅. Eu precisava testar um fluxo que envolvia três métodos e, basicamente, o resultado de um era o parâmetro de entrada para o outro. Porém, o empecilho era: no último método, eu precisava recuperar o endereço de IP do computador que enviou a request para o meu webservice.
Mas como é que a gente recupera os dados de uma request se não tem request? Afinal de contas, eu estava testando somente alguns métodos daquele webservice, então tudo o que era relacionado ao objeto HttpContext não estava preenchido. Como contornar uma situação dessa?
Primeiro, pensei o óbvio: preencher as informações na mão. Às vezes a gente começa a procurar soluções malucas e não pensa no mais simples, certo? Mas não funcionou, a propriedade que eu precisava buscar era read only. Depois, fui jogar a minha angústia no Google, porque provavelmente alguém já teve esse mesmo problema.
E encontrei uma solução deveras simples e enxuta, que funcionou muito bem.
HttpSimulator: testando códigos web
Conforme explicado nesse post do Phil Haack, o HttpSimulator é uma classe melhorada de uma solução que ele já havia implementado anteriormente. De acordo com ele, na primeira solução que ele escreveu, “há casos que eu quero um caminho leve, rápido e sujo para testar código que vai ser usado por um projeto ASP.NET”.¹
Depois de ter gastado algum tempo refatorando o código e melhorando a API, ele nos apresentou o HttpSimulator, que foi o que eu utilizei no meu projeto. Basicamente, eu baixei o .zip oferecido por ele no blog e importei as três principais classes para o meu projeto. À partir delas, consegui simular a request com sucesso e recuperar o endereço de IP (obviamente genérico, 127.0.0.1) que eu precisava para fazer meu método funcionar. Nesse link você consegue ter acesso ao post em que ele fala mais sobre o trabalho que fez e também ao link para o .zip com os arquivos necessários para facilitar a sua vida (não vou colocar o link aqui, vai lá dar uma visualização pro blog do rapaz).
E como ficou o código?
Primeiramente, vamos ao trechinho que causou esse rebuliço todo:
HttpContext.Current.Request.UserHostAddress
Parece inofensivo né? Pois é, mas quase botou tudo abaixo.
E aqui está como eu consegui simular a request com o HttpSimulator:
string valorRecebido = string.Empty; using (HttpSimulator simulator = new HttpSimulator()) { simulator.SimulateRequest(new Uri("http://localhost/WebService.svc")); ClasseExemplo parametros = gravarDados.AjustaParametros(calculo); valorRecebido = ClasseExemplo2.GetValorCampoUnico(parametros.GetDataInput(), "NOME_CAMPO"); } Assert.AreEqual(valorEsperado, valorRecebido);
Simples e funcional do jeito que a gente gosta! ✌ Espero que essa solução também te ajude com simulações de requests nos seus testes automatizados. Bora lá solucionar aquele problema!
¹ Todas as traduções desse texto são livres, feitas por euzinha mesma.
📚 Links consultados
Unit Test Web Code Without A Web Server Using HttpSimulator – You’ve Been Haacked
Simulating Http Context For Unit Tests Without Using Cassini nor IIS – You’ve Been Haacked
HttpContext Class – Documentação da Microsoft
📜 Posts relacionados
✅ Testes automatizados com C# e Selenium – parte 1
💻 Criando testes de carga no Visual Studio (com Selenium)
💌 Recadinhos
Gostou do texto? Tem algo a adicionar? Alguma crítica construtiva? Feedbacks? Sugestões? Pedidos? Fique à vontade para me contatar via email (oli.pmatt@gmail.com), Twitter (@oliviamattiazzo) ou LinkedIn (/oliviamattiazzo) ou pela caixa de comentários aqui embaixo! Vai ser um prazer conversar contigo! ✨
comentario aqui
Funcionou, eu acho 😅