Theo như tôi hiểu, hầu hết mọi người dường như đồng ý rằng các phương thức riêng tư không nên được kiểm tra trực tiếp, mà là thông qua bất kỳ phương thức công khai nào gọi chúng. Tôi có thể thấy quan điểm của họ, nhưng tôi gặp một số vấn đề với điều này khi tôi cố gắng tuân theo "Ba định luật TDD" và sử dụng chu trình "Đỏ - xanh - tái cấu trúc". Tôi nghĩ rằng nó được giải thích tốt nhất bằng một ví dụ:
Ngay bây giờ, tôi cần một chương trình có thể đọc một tệp (chứa dữ liệu được phân tách bằng tab) và lọc ra tất cả các cột có chứa dữ liệu không phải là số. Tôi đoán có lẽ đã có sẵn một số công cụ đơn giản để làm điều này, nhưng tôi đã quyết định tự mình thực hiện nó, chủ yếu là vì tôi nghĩ rằng nó có thể là một dự án tốt và sạch sẽ để tôi thực hành với TDD.
Vì vậy, trước tiên, tôi "đội mũ đỏ", nghĩa là tôi cần một bài kiểm tra thất bại. Tôi hình dung, tôi sẽ cần một phương pháp tìm tất cả các trường không phải là số trong một dòng. Vì vậy, tôi viết một bài kiểm tra đơn giản, tất nhiên là nó không biên dịch ngay lập tức, vì vậy tôi bắt đầu tự viết hàm và sau một vài chu kỳ qua lại (đỏ / xanh) tôi có một hàm làm việc và một bài kiểm tra hoàn chỉnh.
Tiếp theo, tôi tiếp tục với một hàm, "tập hợpNonNumericColumns" để đọc tệp, từng dòng một và gọi hàm "findNonNumericFields" của tôi trên mỗi dòng để thu thập tất cả các cột cuối cùng phải được xóa. Một vài chu kỳ đỏ-xanh, và tôi đã hoàn thành, có một lần nữa, một chức năng làm việc và một bài kiểm tra hoàn chỉnh.
Bây giờ, tôi hình tôi nên tái cấu trúc. Vì phương thức "findNonNumericFields" của tôi chỉ được thiết kế vì tôi cho rằng tôi sẽ cần nó khi triển khai "tập hợpNonNumericColumns", nên có vẻ hợp lý khi để "findNonNumericFields" trở nên riêng tư. Tuy nhiên, điều đó sẽ phá vỡ các thử nghiệm đầu tiên của tôi, vì họ sẽ không còn có quyền truy cập vào phương pháp mà họ đang thử nghiệm.
Vì vậy, tôi kết thúc với một phương thức riêng tư và một bộ thử nghiệm kiểm tra nó. Vì rất nhiều người khuyên rằng không nên thử nghiệm các phương pháp riêng tư, nên có cảm giác như tôi đã vẽ mình vào một góc ở đây. Nhưng chính xác thì tôi đã thất bại ở đâu?
Tôi tập hợp tôi có thể đã bắt đầu ở cấp độ cao hơn, viết một bài kiểm tra để kiểm tra xem cái gì cuối cùng sẽ trở thành phương thức công khai của tôi : Rằng bạn nên chuyển đổi liên tục giữa việc viết thử nghiệm và mã sản xuất, và tại bất kỳ thời điểm nào, tất cả các thử nghiệm của bạn đều hoạt động trong vòng một phút cuối hoặc lâu hơn. Bởi vì nếu tôi bắt đầu bằng cách viết một bài kiểm tra cho một phương thức công khai, sẽ có vài phút (hoặc vài giờ hoặc thậm chí vài ngày trong các trường hợp rất phức tạp) trước khi tôi nhận được tất cả các chi tiết trong các phương thức riêng tư để thử nghiệm công khai phương pháp thông qua.
Vậy lam gi? Có phải TDD (với chu trình tái cấu trúc đỏ-xanh nhanh chóng) đơn giản là không tương thích với các phương thức riêng tư? Hoặc có một lỗi trong thiết kế của tôi?
private
thể nó có ý nghĩa để làm như vậy.