Tôi có một lớp được tái cấu trúc trong 1 lớp chính và 2 lớp nhỏ hơn. Các lớp chính sử dụng cơ sở dữ liệu (giống như nhiều lớp của tôi làm) và gửi email. Vì vậy, lớp chính có một IPersonRepository
và một IEmailRepository
tiêm mà đến lượt nó gửi đến 2 lớp nhỏ hơn.
Bây giờ tôi muốn kiểm tra đơn vị lớp chính, và đã học cách không bỏ qua các hoạt động nội bộ của lớp, bởi vì chúng tôi sẽ có thể thay đổi hoạt động nội bộ mà không phá vỡ các bài kiểm tra đơn vị.
Nhưng khi lớp sử dụng IPersonRepository
và an IEmailRepository
, tôi PHẢI chỉ định kết quả (giả / giả) cho một số phương thức cho IPersonRepository
. Lớp chính tính toán một số dữ liệu dựa trên dữ liệu hiện có và trả về dữ liệu đó. Nếu tôi muốn kiểm tra điều đó, tôi không thấy làm thế nào tôi có thể viết một bài kiểm tra mà không chỉ định rằng IPersonRepository.GetSavingsByCustomerId
trả về x. Nhưng sau đó, bài kiểm tra đơn vị của tôi 'biết' về hoạt động nội bộ, bởi vì nó 'biết' phương pháp nào để chế giễu và phương pháp nào không.
Làm thế nào tôi có thể kiểm tra một lớp đã tiêm phụ thuộc mà không cần kiểm tra biết về các phần bên trong?
lý lịch:
Theo kinh nghiệm của tôi, rất nhiều thử nghiệm như thế này tạo ra các giả cho các kho lưu trữ và sau đó cung cấp dữ liệu phù hợp cho các giả hoặc kiểm tra nếu một phương thức cụ thể được gọi trong khi thực thi. Dù bằng cách nào, bài kiểm tra biết về nội bộ.
Bây giờ tôi đã thấy một bài trình bày về lý thuyết (mà tôi đã nghe trước đây) rằng bài kiểm tra không nên biết về việc thực hiện. Đầu tiên bởi vì bạn không kiểm tra cách thức hoạt động của nó, mà còn bởi vì khi bạn thay đổi việc triển khai, tất cả các kiểm tra đơn vị đều thất bại vì họ 'biết' về việc triển khai. Mặc dù tôi thích khái niệm về các bài kiểm tra mà không biết về việc thực hiện, tôi không biết làm thế nào để hoàn thành nó.
IPersonRepository
đối tượng, giao diện đó và tất cả các phương thức mà nó mô tả không còn là "nội bộ" nữa, vì vậy nó không thực sự là một vấn đề của bài kiểm tra. Câu hỏi thực sự của bạn phải là "làm thế nào tôi có thể cấu trúc lại các lớp thành các đơn vị nhỏ hơn mà không để lộ quá nhiều ở nơi công cộng". Câu trả lời là "giữ cho các giao diện đó nạc" (ví dụ, bằng cách tuân thủ nguyên tắc phân chia giao diện). Đó là IMHO điểm 2 trong câu trả lời của @ DavidArno (Tôi đoán rằng tôi không cần phải lặp lại điều đó trong câu trả lời khác).