Vấn đề xảy ra trong khi làm TDD. Sau một vài lần kiểm tra, các kiểu trả về của một số lớp / mô-đun thay đổi. Trong ngôn ngữ lập trình được nhập tĩnh, nếu một đối tượng giả định trước đó được sử dụng trong các thử nghiệm của một số lớp khác và không được sửa đổi để phản ánh sự thay đổi loại, thì sẽ xảy ra lỗi biên dịch.
Tuy nhiên, đối với các ngôn ngữ động, sự thay đổi trong các kiểu trả về có thể không được phát hiện và các bài kiểm tra của lớp khác sẽ vẫn vượt qua. Chắc chắn có thể có các bài kiểm tra tích hợp sẽ thất bại sau này, nhưng các bài kiểm tra đơn vị sẽ vượt qua một cách sai lầm. Có cách nào để tránh điều này?
Cập nhật với một mẫu tầm thường (trên một số ngôn ngữ tạo thành) ...
Phiên bản 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)
}
Bây giờ, trên phiên bản 2:
// I change the return types. I also update the tests for Calc
Calc = {
doMultiply(x, y) {return {result: (x * y), success:true}}
}
... Rect sau đó sẽ đưa ra một ngoại lệ trong thời gian chạy, nhưng thử nghiệm vẫn sẽ thành công.
class X
, mà là các thử nghiệmclass Y
phụ thuộcX
và do đó được thử nghiệm đối với một hợp đồng khác so với những gì nó chạy trong sản xuất.