Das Problem tritt beim TDD auf. Nach einigen Testdurchläufen ändern sich die Rückgabetypen einiger Klassen / Module. Wenn in einer statisch typisierten Programmiersprache ein zuvor verspottetes Objekt in den Tests einer anderen Klasse verwendet wurde und nicht geändert wurde, um die Typänderung widerzuspiegeln, treten Kompilierungsfehler auf.
Bei dynamischen Sprachen wird die Änderung der Rückgabetypen möglicherweise nicht erkannt, und die Tests der anderen Klasse werden weiterhin bestanden. Sicher, es könnte Integrationstests geben, die später fehlschlagen sollten, aber Unit-Tests würden fälschlicherweise bestanden. Gibt es eine Möglichkeit, dies zu vermeiden?
Aktualisierung mit einem trivialen Beispiel (in einer erfundenen Sprache) ...
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)
}
Nun zu 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öst dann zur Laufzeit eine Ausnahme aus, der Test ist jedoch weiterhin erfolgreich.
class X
, sondern deren Testsclass Y
davon abhängenX
und somit gegen einen anderen Vertrag getestet werden als gegen das, gegen das es in der Produktion läuft.