Tôi có một đối tượng dịch vụ không phát triển được phát triển với TDD. Nó bắt đầu với một nhiệm vụ đơn giản: Đối với một đối tượng từ hàng đợi, hãy xây dựng một nỗ lực để xử lý không đồng bộ. Vì vậy, tôi đã viết một bài kiểm tra xung quanh phương pháp constructAttempt()
tôi:TDD - Tái cấu trúc thành hộp đen?
void constructAttempt() {...}
Có rất nhiều tình huống có thể là cần phải được xem xét, vì vậy tôi có một tá các xét nghiệm cho phương pháp này.
Sau đó, tôi đã thực hiện những gì tôi thực sự cần để làm: Quét toàn bộ hàng đợi và tạo một loạt các lần thử. Vì vậy, mã trông giống như:
public void go() {
for (QueuedItem item : getQueuedItems()) {
constructAttempt(item);
}
}
Vì vậy, tôi đã thêm một hoặc hai thử nghiệm mới cho phương pháp go()
này.
Cuối cùng tôi phát hiện ra tôi cần một số tiền xử lý đôi khi có thể ảnh hưởng đến constructAttempt()
. Bây giờ mã trông giống như:
public void go() {
preprocess();
for (QueuedItem item : getQueuedItems()) {
constructAttempt(item);
}
}
tôi có một vài nghi ngờ về những gì tôi nên làm gì bây giờ.
Tôi có giữ mã như cũ, với constructAttempt()
, preprocess()
và go()
thử nghiệm độc lập không? Tại sao có/tại sao không? Tôi có nguy cơ không bao gồm các tác dụng phụ của tiền xử lý và phá vỡ đóng gói.
Hoặc tôi có nên cấu trúc lại toàn bộ bộ thử nghiệm của mình để chỉ gọi go()
(phương pháp công khai duy nhất)? Tại sao có/tại sao không? Điều này sẽ làm cho các bài kiểm tra hơi mơ hồ hơn một chút, nhưng mặt khác nó sẽ đưa tất cả các tương tác có thể vào xem xét. Thực tế nó sẽ trở thành một thử nghiệm hộp đen chỉ sử dụng API công khai, những gì có thể không phù hợp với TDD.
Nếu bạn cấu trúc lại bộ thử nghiệm của mình để chỉ kiểm tra phương thức go() ... bạn sẽ xác định như thế nào nếu các lỗi được phát hiện có trên preprocess() hoặc constructAttempt ?? –