O problema ocorre ao fazer o TDD. Após algumas passagens no teste, os tipos de retorno de alguma classe / módulo são alterados. Em uma linguagem de programação estaticamente tipada, se um objeto simulado anterior foi usado nos testes de alguma outra classe e não foi modificado para refletir a alteração de tipo, ocorrerão erros de compilação.
No entanto, para idiomas dinâmicos, a alteração nos tipos de retorno pode não ser detectada e os testes da outra classe ainda serão aprovados. Certamente, pode haver testes de integração que falharão mais tarde, mas os testes de unidade serão erroneamente aprovados. Existe alguma maneira de evitar isso?
Atualizando com uma amostra trivial (em alguma linguagem inventada) ...
Versão 1:
Calc = {
doMultiply(x, y) {return x * y}
}
//.... more code ....
// On some faraway remote code on a different file
Rect = {
computeArea(l, w) {return Calc.doMultipy(x*y)}
}
// test for Rect
testComputeArea() {
Calc = new Mock()
Calc.expect(doMultiply, 2, 30) // where 2 is the arity
assertEqual(30, computeArea)
}
Agora, na versão 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... O Rect lançará uma exceção no tempo de execução, mas o teste ainda terá êxito.
class X
, masclass Y
cujos testes dependemX
e, portanto, são testados contra um contrato diferente do que é executado na produção.