Atualmente, estou preparando as bases para um aplicativo ASP.Net MVC e estou analisando que tipo de testes de unidade devo estar preparado para escrever. Eu já vi em vários lugares pessoas dizendo essencialmente 'não se incomode em testar seus pontos de vista, não há lógica e é trivial e será coberto por um teste de integração'.
Não entendo como isso se tornou a sabedoria aceita. Os testes de integração têm uma finalidade totalmente diferente dos testes de unidade. Se eu quebrar alguma coisa, não quero saber meia hora depois, quando meus testes de integração forem interrompidos, quero saber imediatamente.
Cenário de exemplo: digamos que estamos lidando com um aplicativo CRUD padrão com uma entidade do Cliente. O cliente tem um nome e um endereço. Em cada nível de teste, desejo verificar se a lógica de recuperação do Cliente obtém o nome e o endereço corretamente.
Para testar o repositório da unidade, escrevo um teste de integração para acessar o banco de dados. Para testar as regras de negócios, eu zombei do repositório, alimentei os dados apropriados das regras de negócios e verifiquei se meus resultados esperados foram retornados.
O que eu gostaria de fazer: Para testar a unidade da interface do usuário, zombei das regras de negócios, configurei minha instância esperada do cliente, renderize a exibição e verifique se a exibição contém os valores apropriados para a instância especificada.
O que estou parado de fazer: Para testar o repositório da unidade, escrevo um teste de integração, configuro um login apropriado, crie os dados necessários no banco de dados, abra um navegador, navegue até o cliente e verifique se a página resultante contém as informações apropriadas. valores para a instância que especifiquei.
Percebo que há sobreposição entre os dois cenários discutidos acima, mas a principal diferença é o tempo e o esforço necessários para configurar e executar os testes.
Se eu (ou outro desenvolvedor) remover o campo de endereço da exibição, não quero esperar que o teste de integração descubra isso. Eu quero é descoberto e sinalizado em um teste de unidade que recebe várias vezes ao dia.
Tenho a sensação de que não estou entendendo algum conceito-chave. Alguém pode explicar por que é ruim desejar um feedback imediato do teste sobre a validade de uma exibição do MVC? (ou se não for ruim, não é a maneira esperada de obter esse feedback)
"To unit-test the repository, I write an integration test"
Espere o que? Isso não é um teste de unidade do repositório. Você está automatizando o teste, mas o código em teste ainda inclui o DAL e o banco de dados. Para testar o repositório por unidade, você o isola como nas regras de negócios.