Masalah terjadi saat melakukan TDD. Setelah beberapa tes lulus, tipe-tipe pengembalian beberapa kelas / modul berubah. Dalam bahasa pemrograman yang diketik secara statis, jika objek mocked sebelumnya digunakan dalam tes beberapa kelas lain dan tidak dimodifikasi untuk mencerminkan perubahan tipe, maka kesalahan kompilasi akan terjadi.
Namun untuk bahasa dinamis, perubahan tipe pengembalian mungkin tidak terdeteksi dan tes dari kelas lain masih akan berlalu. Tentu mungkin ada tes integrasi yang harus gagal nanti, tetapi unit test akan keliru berlalu. Apakah ada cara bagaimana menghindari ini?
Memperbarui dengan sampel sepele (pada beberapa bahasa yang dibuat-buat) ...
Versi 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)
}
Sekarang, pada versi 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... Rect akan melempar eksepsi pada runtime, namun tes masih akan berhasil.
class X
, tetapi tesclass Y
yang bergantung padaX
dan dengan demikian diuji terhadap kontrak yang berbeda dari apa yang bertentangan dalam produksi.