Il problema si verifica durante l'esecuzione del TDD. Dopo un paio di passaggi di test, i tipi restituiti di alcune classi / moduli cambiano. In un linguaggio di programmazione tipicamente statico, se nei test di un'altra classe è stato utilizzato un oggetto deriso precedente e non è stato modificato per riflettere la modifica del tipo, si verificheranno errori di compilazione.
Per i linguaggi dinamici, tuttavia, la modifica dei tipi restituiti potrebbe non essere rilevata e i test dell'altra classe continueranno comunque. Sicuramente potrebbero esserci dei test di integrazione che dovrebbero fallire in seguito, ma i test unitari passerebbero erroneamente. C'è un modo per evitarlo?
Aggiornamento con un esempio banale (su un linguaggio inventato) ...
Versione 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)
}
Ora, nella versione 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... Rect genererà quindi un'eccezione in fase di esecuzione, ma il test avrà comunque esito positivo.
class X
, ma i cui testclass Y
dipendonoX
e quindi vengono testati rispetto a un contratto diverso rispetto a ciò che si scontra nella produzione.