Prefira testar à interface do que testar na implementação.
Entendo que métodos privados não podem ser testados
Isso depende do seu ambiente de desenvolvimento, veja abaixo.
[métodos privados] não devem se preocupar porque a API pública fornecerá informações suficientes para verificar a integridade de um objeto.
É isso mesmo, o TDD se concentra em testar a interface.
Métodos privados são um detalhe de implementação que pode mudar durante qualquer ciclo de re-fatoração. Deve ser possível re-fatorar sem alterar a interface ou o comportamento da caixa preta . De fato, isso faz parte do benefício do TDD, a facilidade com a qual você pode gerar a confiança de que mudanças internas a uma classe não afetarão os usuários dessa classe.
Bem, é possível criar um objeto que possua apenas métodos particulares e interaja com outros objetos ouvindo seus eventos. Isso seria muito encapsulado, mas completamente não testável.
Mesmo se a classe não tem métodos públicos, é manipuladores de eventos são é interface pública , e seu contra essa interface pública que você pode testar.
Como os eventos são a interface, são os eventos que você precisará gerar para testar esse objeto.
Procure usar objetos simulados como a cola para o seu sistema de teste. Deve ser possível criar um objeto simulado simples que gere um evento e capte a mudança de estado resultante (possível por outro objeto simulado do receptor).
Além disso, é considerado uma prática ruim adicionar métodos para testar.
Absolutamente, você deve ter muito cuidado com a exposição do estado interno.
Isso significa que o TDD está em desacordo com o encapsulamento? Qual é o saldo apropriado?
Absolutamente não.
O TDD não deve alterar a implementação de suas classes além de talvez simplificá-las (aplicando o YAGNI de um ponto anterior).
As melhores práticas com TDD são idênticas às melhores práticas sem TDD, basta descobrir o motivo mais cedo, porque você está usando a interface enquanto a desenvolve.
Estou inclinado a tornar a maioria ou todos os meus métodos públicos agora ...
Isso seria jogar o bebê fora com a água do banho.
Você não precisa tornar todos os métodos públicos, para poder desenvolver de maneira TDD. Veja minhas anotações abaixo para ver se seus métodos privados são realmente intratáveis.
Uma visão mais detalhada do teste de métodos privados
Se você absolutamente deve testar alguns comportamentos particulares de uma classe, dependendo do idioma / ambiente, você pode ter três opções:
- Coloque os testes na classe que você deseja testar.
- Coloque os testes em outro arquivo de classe / fonte e exponha os métodos particulares que você deseja testar como métodos públicos.
- Use um ambiente de teste que permita manter o código de teste e produção separado, e ainda assim permitir o acesso ao código de teste a métodos particulares do código de produção.
Obviamente, a terceira opção é de longe a melhor.
1) Coloque os testes na classe que você deseja testar (não é o ideal)
Armazenar casos de teste no mesmo arquivo de classe / origem que o código de produção em teste é a opção mais simples. Mas sem muitas diretivas ou anotações pré-processador, você terminará com o código de teste inchando seu código de produção desnecessariamente e, dependendo de como você estruturou seu código, poderá acabar expondo acidentalmente a implementação interna para os usuários desse código.
2) Exponha os métodos particulares que você deseja testar como métodos públicos (realmente não é uma boa ideia)
Conforme sugerido, essa é uma prática muito ruim, destrói o encapsulamento e expõe a implementação interna aos usuários do código.
3) Use um ambiente de teste melhor (melhor opção, se estiver disponível)
No mundo Eclipse, 3. pode ser alcançado usando fragmentos . No mundo C #, podemos usar classes parciais . Outros idiomas / ambientes geralmente têm funcionalidades semelhantes, basta encontrá-las.
Assumindo cegamente que 1. ou 2. são as únicas opções, provavelmente resultaria em um software de produção inchado com código de teste ou interfaces de classe desagradáveis que lavam a roupa suja em público. * 8 ')
- Em suma, é muito melhor não testar contra a implementação privada.