Rất nhiều nhà phát triển cho rằng thử nghiệm các phương pháp riêng tư là một ý tưởng tồi. Tuy nhiên, tất cả các ví dụ tôi đã tìm thấy dựa trên ý tưởng rằng các phương thức riêng tư là riêng tư bởi vì gọi chúng có thể phá vỡ trạng thái của đối tượng bên trong. Nhưng đó không chỉ là lý do để ẩn phương pháp.Phương pháp riêng thử nghiệm đơn vị: Mẫu mặt tiền
Hãy xem xét Mẫu mặt tiền. Người dùng lớp của tôi cần 2 phương thức công khai. Chúng sẽ quá lớn. Trong ví dụ của tôi, họ cần tải một số cấu trúc phức tạp từ BLOB của cơ sở dữ liệu, phân tích nó, điền một số đối tượng COM tạm thời, chạy macro của người dùng để xác nhận hợp lệ và sửa đổi các đối tượng này, và sắp xếp các đối tượng đã sửa đổi thành XML. Khá lớn chức năng cho metod duy nhất :-) Hầu hết các hành động này là cần thiết cho cả hai phương pháp công cộng. Vì vậy, tôi đã tạo ra khoảng 10 phương pháp riêng và 2 phương pháp công khai gọi chúng. Trên thực tế, phương pháp riêng tư của tôi không nhất thiết phải là riêng tư; họ sẽ không phá vỡ trạng thái bên trong của ví dụ. Tuy nhiên, khi tôi không wont thử nghiệm phương pháp riêng, tôi có những vấn đề sau đây:
- Xuất bản họ có nghĩa là phức tạp cho người dùng (họ có một sự lựa chọn họ không cần)
- Tôi không thể tưởng tượng phong cách TDD cho một phương pháp công khai lớn như vậy, khi bạn viết 500 + dòng mã chỉ để trả về một cái gì đó (thậm chí không phải là kết quả thực).
- Dữ liệu cho các phương pháp này được truy xuất từ cơ sở dữ liệu và việc thử nghiệm chức năng liên quan đến DB khó khăn hơn nhiều.
Khi tôi đang thử nghiệm phương pháp riêng:
- tôi không công bố chi tiết đó sẽ khiến người dùng. Giao diện công cộng bao gồm 2 phương thức.
- Tôi có thể làm việc theo kiểu TDD (viết các phương thức nhỏ theo từng bước).
- Tôi có thể bao gồm hầu hết các chức năng của lớp bằng cách sử dụng dữ liệu thử nghiệm, không có kết nối cơ sở dữ liệu.
Ai đó có thể mô tả, tôi đang làm gì sai? Tôi nên sử dụng thiết kế nào để có được cùng một khoản tiền thưởng và không thử nghiệm các phương pháp riêng tư?
CẬP NHẬT: Dường như với tôi tôi đã trích xuất tất cả mọi thứ tôi đã có thể đến các lớp khác. Vì vậy, tôi không thể tưởng tượng những gì tôi có thể trích xuất bổ sung. Việc tải từ cơ sở dữ liệu được thực hiện bởi lớp ORM, phân tích luồng, tuần tự hóa thành XML, chạy macro - mọi thứ được thực hiện bởi các lớp độc lập. Lớp này chứa cấu trúc dữ liệu khá phức tạp, các thường trình để tìm kiếm và chuyển đổi, và các cuộc gọi cho tất cả các tiện ích đã đề cập. Vì vậy, tôi không nghĩ rằng cái gì khác có thể được trích xuất; nếu không, trách nhiệm của nó (kiến thức về cấu trúc dữ liệu) sẽ được chia giữa các lớp. Vì vậy, phương pháp tốt nhất để giải quyết mà tôi thấy bây giờ là chia thành 2 đối tượng (Mặt tiền và đối tượng thực, với phương thức riêng trở thành công khai) và di chuyển đối tượng thực đến đâu đó không ai cố gắng tìm nó. Trong trường hợp của tôi (Delphi) nó sẽ là một đơn vị độc lập, trong các ngôn ngữ khác nó có thể là một không gian tên riêng biệt. Tùy chọn tương tự khác là 2 giao diện, cảm ơn ý tưởng.
Có vẻ như đã có một câu hỏi giống hệt với câu hỏi này: http://stackoverflow.com/questions/250692/how-do-you- unit-test-private-methods –
Không có nó không phải là một dupe – krosenvold
Đây là blog về thử nghiệm phương pháp riêng trong C# http: //www.coolaspdotnetcode.com/Web/NunitTesting-testingprivatemethod.aspx – Shiva