Tôi thực sự quen với TDD gần đây, và sau khi đọc cuốn sách của Kent Beck về Phát triển thử nghiệm, tôi vẫn có nhiều câu hỏi xung quanh thiết kế thử nghiệm trong tâm trí của tôi.TDD Mocking - Đang xác định thử nghiệm đối tượng mô phỏng hộp màu trắng?
Một trong những vấn đề tôi hiện đang gặp là sử dụng các đối tượng Mock. Thực hiện dưới đây rất đơn giản để tạo báo cáo:
public string MakeFinancialReport()
{
return sys1.GetData() + sys2.GetData() + sys3.GetData();
}
Báo cáo phải chứa tiêu đề, nội dung và chân trang. Vì vậy, một thử nghiệm nhanh để xem những danh hiệu tồn tại trong báo cáo:
public void TestReport()
{
string report = MakeFinancialReport();
Assert.IsTrue(report.Contains("[Title]") && report.Contains("[Body]") && report.Contains("[Footer]"));
}
Để cô lập phương pháp này, tôi đoán tôi sẽ chế giễu đi những sys1, sys2 và sys3 cuộc gọi. Bây giờ, nếu tất cả chúng đều là mocks, thì tôi có gì để kiểm tra? Ngoài ra, khi tôi chế nhạo chúng, tại sao tôi phải nói với các đối tượng giả định rằng chúng sẽ được gọi là một lần và trả về X vv. Nó không chỉ là một thử nghiệm hộp đen và MakeFinancialReport có thể thực hiện nhiều cuộc gọi như nó muốn xây dựng báo cáo?
Tôi đang bối rối với một vấn đề nhỏ như vậy, tôi không chắc chắn những gì tôi đang thiếu. Tôi thấy Mocking như lấy đi mã có thể thử nghiệm, và đối với hầu hết các phương pháp đơn giản, những gì còn lại để kiểm tra là không hữu ích cả.
Hmm, sau đó tôi nghĩ rằng tôi thiếu thiết kế thử nghiệm hiệu trưởng ở đâu đó. Tôi nghĩ thử nghiệm đơn vị là kiểm tra một phương pháp, một đoạn mã rời rạc nhỏ, không phải bất kỳ đối tượng cộng tác nào của nó. Các đối tượng cộng tác trong trường hợp này, sys1, sys2 và sys3, mỗi đối tượng đều có các bài kiểm tra đơn vị riêng của họ được bao gồm trong các bài kiểm tra đơn vị riêng biệt. Bài viết của Martin Fowler tôi đã đọc nhiều lần và từ những gì tôi có thể lấy từ sự khác biệt của Mocks và Stubs là sự khác biệt giữa kiểm tra trạng thái và hành vi. – Martin
Tôi vẫn cần phải hiểu rằng tại sao chúng ta sử dụng chúng là vì chúng ta đang cố gắng di chuyển sự phức tạp của mã gọi bên ngoài một phương thức/đơn vị để chúng ta có thể tập trung vào hành vi của một phương pháp. Vì vậy, trong trường hợp này, chính xác những gì còn lại trong phương thức eMakeFinancialReport() nếu chúng ta lấy đi 3 cuộc gọi hệ thống thông qua mocks? – Martin
Trong ví dụ của bạn, @Martin, tất cả những gì còn lại là nối chuỗi. Đó không phải là nhiều để kiểm tra. Nếu không có gì để kiểm tra, thì đó là một mùi mã sẽ thúc đẩy bạn hướng tới việc tái cấu trúc "Inline Method". Có lẽ bạn nên tìm một ví dụ tốt hơn. –