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.

As três atrizes do filme "Estrelas além do tempo", uma delas segurando um prêmio e dizendo "These women didn't complain, they focused on solutions"
Essas mulheres não reclamaram, elas focaram em soluções.

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.

Duas mãos de desenho animado digitam freneticamente em um teclado azul, com uma tela à frente

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).

Uma mão humana "clicando"

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! ✨

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.