No
último texto sobre afirmações , algo importante estava faltando e não foi acordado.
Qual a diferença entre dado e quando e como isso está relacionado às afirmações?
A ideia subjacente a isso é simples - queremos limitar o número de afirmações.
Considere um pequeno exemplo.
Vamos passar algum objeto válido para o método, chamar o serviço adicional e enriquecer suas propriedades.
Não devo escrever o código antes do teste, portanto, assumiremos que isso é apenas para transmitir a imagem geral.
public User enrichUser(User validUser){ user.setDetails(enrichmentService.getUserDetails(validUser.getId())); return user; }
Não estamos interessados em variações validUser. Não é nulo, sempre tem um ID e é válido. Esta é uma pré-condição, ou seja, dado.
De fato, precisamos considerar duas condições - o enriquecimento do serviço falha e o sucesso. Esta é uma condição, ou seja, quando
Como distinguir um do outro?
Dado não requer verificação de outros casos, quando - requer. I.e. whenValidUser requer whenInvalidUser, e givenValidUser não.
E enriqumentservice == null? Se injetarmos uma dependência, poderemos considerar essa parte da configuração e não pensar nos testes. Absolutamente. Existem pré-condições que não fazem sentido listar.
Se o método aceitar apenas usuário, o número de scripts sendo verificados aumentará. Dado se torna quando.
Outra pergunta - mas, estritamente falando, por acidente ou intencionalmente, um método pode arruinar um usuário para nós? Não deveríamos dar uma olhada?
Se respondermos - sim, devemos, teremos que admitir que isso pode ser um grande fardo. Um usuário pode ter cinquenta propriedades e a verificação delas em cada método pode ser cara. Existem verificações em massa usando bibliotecas, mas perdemos a importante função do teste - prescrever a funcionalidade desejada e não coletar a sujeira por trás da curva de implementação.
Isso pode ser comparado à segurança do aeroporto - alguém verifica a passagem, a bagagem, os bolsos e os cheques não são duplicados a cada passo. I.e. Os ativos confiam no que a implementação fará e verifique apenas o que prescrevem.
Assim, uma pré-condição adequadamente construída reduz o número de scripts e asserções. Fazemos afirmações apenas sob condição.
Infelizmente, estruturas como o Pepino não fazem muita diferença, porque as próprias pré-condições não verificam se o termo Given, that When é o mesmo, puramente descritivo.
Em casos mais complexos, é difícil distinguir um do outro, que por si só cheira. Por exemplo, muitos testes seguidos verificam a mesma coisa ou algumas das condições nos testes são esquecidas ou ignoradas como inadequadas.
Esse é um bom motivo para reestruturar as especificações e redesenhar.