Проблема возникает при выполнении TDD. После нескольких тестовых прохождений типы возвращаемых данных некоторых классов / модулей меняются. В статически типизированном языке программирования, если предыдущий смоделированный объект использовался в тестах какого-либо другого класса и не был изменен для отражения изменения типа, тогда произойдут ошибки компиляции.
Однако для динамических языков изменение типов возврата может не обнаруживаться, и тесты другого класса все равно будут проходить. Конечно, могут быть интеграционные тесты, которые в дальнейшем не пройдут, но модульные тесты будут ошибочно проходить. Есть ли способ, как этого избежать?
Обновление с тривиальным образцом (на некоторых выдуманных языках) ...
Версия 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)
}
Теперь о версии 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... Rect затем выдаст исключение во время выполнения, но тест все равно будет успешным.
class X
, а в том, отclass Y
каких тестов зависитX
и, таким образом, их тестируют по контракту, отличному от того, с которым он работает в производстве.