Le problème se produit lors de l'exécution de TDD. Après quelques tests réussis, les types de retour de certaines classes / modules changent. Dans un langage de programmation typé statiquement, si un objet simulé précédent a été utilisé dans les tests d'une autre classe et n'a pas été modifié pour refléter le changement de type, des erreurs de compilation se produisent.
Cependant, pour les langages dynamiques, la modification des types de retour peut ne pas être détectée et les tests de l' autre classe réussiront toujours. Bien sûr, il pourrait y avoir des tests d'intégration qui devraient échouer plus tard, mais les tests unitaires passeraient par erreur. Existe-t-il un moyen d'éviter cela?
Mise à jour avec un échantillon trivial (sur certains langages inventés) ...
Version 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)
}
Maintenant, sur la version 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... Rect lèvera alors une exception lors de l'exécution, mais le test réussira quand même.
class X
, mais dont les testsclass Y
dépendentX
et sont donc testés par rapport à un contrat différent de celui auquel il se heurte en production.