Depois de ler alguns artigos sobre Newable vs injetáveis objetos e como esses conceitos se relacionam com os serviços da DDD, entidades e objetos de valor, fiquei com algumas dúvidas sobre a utilização newables no meu código, especialmente em meus testes de unidade.
Os principais candidatos às novidades foram os objetos Entidades e Valor, o que significa que, em vez de injetar essas dependências em outros objetos, deve-se apenas new
uma instância desses objetos e usá-los diretamente no código.
No entanto, boas práticas de DDD defendem a atribuição de responsabilidades a entidades e objetos de valor, se elas forem consideradas apropriadas. Portanto, as entidades e os objetos de valor acabarão tendo uma lógica de negócios séria.
Agora, se um serviço opera em uma entidade ou objeto de valor, devo zombar da entidade ou objeto de valor e passar a zombaria para o serviço (zombar exigirá um interface
valor para os objetos ou entidades de valor que parecem ser defendidos)?
Ou devo apenas new
um objeto de entidade / valor e passar uma implementação concreta para o serviço, violando o princípio do teste de unidade de testar apenas uma unidade?
Respostas:
Estou lendo que você é da opinião de que os testes de unidade, assim como os objetos SOLID, devem ter "um motivo para quebrar". É um objetivo nobre, mas acho que você descobrirá que, em muitos casos, simplesmente não é viável. Um desses casos é aqui, onde você tem um objeto de domínio "rico" (o DDD diferencia entre Entidades e Objetos de Valor, que incluem o "modelo de domínio") que é uma dependência do sistema em teste.
Nessas situações, tenho a filosofia de que, dada ao objeto de domínio tem sua própria cobertura abrangente de teste de unidade, confiar que o objeto funcionará conforme projetado em um teste de unidade para um SUT diferente não viola necessariamente o teste de unidade. Se esse teste fosse interrompido devido a uma alteração no domínio, esperaria que o teste de unidade do objeto de domínio também fosse interrompido, o que me levou a algo a ser investigado. Se o teste de unidade do objeto de domínio foi atualizado corretamente como um teste vermelho, ficou verde com a alteração e esse outro teste falhou, isso também não é necessariamente uma coisa ruim; significa que as expectativas desse outro teste estão em conflito com as novas expectativas para o domínio, e eu preciso garantir que ambos concordem um com o outro e com os critérios gerais de aceitação do sistema.
Como tal, eu apenas zombaria de um objeto de domínio se esse objeto de domínio produzisse "efeitos colaterais" indesejáveis do ponto de vista do teste de unidade (por exemplo, tocar em recursos externos como armazenamentos de dados) ou se a lógica do objeto de domínio fosse suficientemente complexa que colocá-lo no estado apropriado para o teste se torna um obstáculo para definir e passar no teste.
Isso então se torna a questão motriz; qual é mais fácil? Para usar o objeto de domínio para a finalidade pretendida dentro do teste ou para zombar dele? Faça o que for mais fácil, até que não seja mais a opção mais fácil, como quando uma mudança funcional interrompe o teste do serviço de maneira complexa; se isso acontecer, reescreva o teste para produzir uma simulação que exponha os requisitos funcionais dos quais o serviço depende, sem a complexidade que o interrompe.
Entenda que, de qualquer maneira, deve haver um teste de integração que use o objeto de domínio real conectado ao serviço real que teste a interação entre os dois em um nível mais alto de abstração (como testar, por exemplo, não apenas a funcionalidade por trás de um serviço terminal, mas um proxy através do qual o objeto de domínio é serializado e enviado).
fonte
Confiando na classe dependente de que funciona corretamente, esperando que falhem alguns testes de unidade quando algo não funcionar, então isso deve ser testado muito bem . Talvez estejam faltando alguns testes de unidade importantes? Pode haver um caso não testado que criaria um erro, que será produzido na minha classe de teste de origem e não seria detectado na própria classe dependente.
Portanto, na minha opinião, para testes de unidade, as classes dependentes devem ser ridicularizadas. Se não o fizer, é um teste integracional.
fonte