Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dúvida no Ex. 6 da Aula 1 - A grande variedade de impostos e o padrão Strategy

Chamar int chute = random.Next(10); dentro do método irá impedir a criação de testes unitários para esta classe. O ideal não seria ter uma property com uma classe que contém um método que faz tal ação, desta forma poderia facilmente fazer o moq da classe "Sorteador" e fazer o teste para todos os casos?

5 respostas
solução

Oi Marcelo,

de fato, colocar um Random que é criado dentro da própria classe atrapalha muito a criação de testes automatizados para a classe. A solução que você propôs é uma boa saída para esse caso.

Outra proposta seria simplesmente receber a dependência do Random no construtor e, dessa forma, você poderia passar uma versão mockada do próprio Random, sem ter que encapsulá-lo em outra classe.

Injetar as dependências que a gente não consegue controlar é, frequentemente, uma boa prática de código! Exatamente porque, como você bem observou, passa a permitir criarmos testes de unidade.

Olá Marcelo e Cecilia,

Tenho pouquíssima experiência em desenvolvimento e testes de unidade e gostaria portanto de saber o motivo pelo qual esse numero randômico atrapalha a criação dos testes unitários nesse caso.

Vocês poderiam me dar mais detalhes?

Oi Jefferson,

quando escrevemos um teste dizemos que:

  1. Para esse cenário com valor de entrada específico;
  2. Esperamos essa resposta específica.

Quando temos um número randomicamente gerado dentro do método, mesmo que a gente saiba o valor de entrada, a resposta pode ser qualquer coisa diferente.

Por exemplo, suponha que você tem uma função que recebe um nome e devolve um login gerado automaticamente que é o nome e mais um monte de números.

Se os números forem sequenciais, é fácil de saber que o teste que chamar a função uma vez com o nome "ceci" vai devolver "ceci-1". Mas se ele for randômico, pode ser "ceci-1532235" na primeira vez que rodar e, sei lá, "ceci-9869832" da próxima vez, etc.

A gente não tem como saber qual vai ser a resposta específica, então fica muito difícil de testar.

Fez sentido?

Faz todo sentido. Corrija me se minha afirmação a seguir estiver equivocado.

Uma vez que valor randômico é injetado, e não parte do método, somos capazes de forçar valores específicos para ele de maneira que possamos ter controle da resposta. Viabilizando assim o teste unitário efetivo.

Desde já agradeço.

Isso aí, Jefferson. Perfeito! :-)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software