Devemos zombar de entidades e objetos de valor ao fazer DDD?

9

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 newuma 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 interfacevalor para os objetos ou entidades de valor que parecem ser defendidos)?

Ou devo apenas newum 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?

Songo
fonte
Relacionados: stackoverflow.com/q/2833422
Robert Harvey
Depende se você é um clássico ou um testador mockist: martinfowler.com/articles/mocksArentStubs.html
jhewlett
@jhewlett Um classicista não zombaria de nada; um mockista provavelmente zombaria apenas de Serviços, Repositórios e Fábricas (que são "injetáveis"), nunca Entidades ou Objetos de Valor (que são "novidade").
Rogério
@ Rogério, quando você diz Serviços; você quer dizer Serviços de aplicativos ou Serviços de domínio?
w0051977
@Ongo, o que você decidiu? Você zomba: Entidades; Objetos de valor e serviços de domínio?
precisa saber é o seguinte

Respostas:

11

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

KeithS
fonte
No DDD, o "modelo de domínio" também inclui Serviços de Domínio, Repositórios e Fábricas, não apenas Entidades e Objetos de Valor.
Rogério
0

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.

Fabian Picone
fonte