Problem występuje podczas wykonywania TDD. Po kilku zdaniach testowych zmieniają się typy zwracane przez niektóre klasy / moduły. W statycznym języku programowania, jeśli poprzedni próbny obiekt był używany w testach innej klasy i nie został zmodyfikowany w celu odzwierciedlenia zmiany typu, wystąpią błędy kompilacji.
Jednak w przypadku języków dynamicznych zmiana typów zwracanych znaków może nie zostać wykryta, a testy drugiej klasy będą nadal zaliczane. Jasne, że mogą istnieć testy integracyjne, które później powinny zakończyć się niepowodzeniem, ale testy jednostkowe zakończyłyby się błędem. Czy jest jakiś sposób, aby tego uniknąć?
Aktualizowanie za pomocą trywialnej próbki (w niektórych wymyślonych językach) ...
Wersja 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)
}
Teraz w wersji 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... Następnie Rect zgłasza wyjątek w czasie wykonywania, ale test nadal się powiedzie.
class X
, ale testyclass Y
zależą od tego,X
a zatem są testowane na podstawie innego kontraktu niż to, z czym ma do czynienia w produkcji.