Loại trả lại không có giá trị/Chương trình con là tin cũ. Tôi đã không thực hiện một loại trở lại Void (Trừ khi tôi đã được cực kỳ lười biếng) trong như 8 năm (Từ thời điểm câu trả lời này, vì vậy chỉ cần một chút trước khi câu hỏi này được hỏi).
Thay vì một phương pháp như:
public void SendEmailToCustomer()
Thực hiện một phương pháp mà sau int của Microsoft.TryParse() mô hình:
public bool TrySendEmailToCustomer()
Có lẽ không có bất kỳ thông tin phương pháp của bạn cần phải quay trở lại để sử dụng trong dài hạn, nhưng trở về trạng thái của phương pháp này sau khi nó thực hiện công việc của mình là một sử dụng rất lớn đến người gọi.
Ngoài ra, bool không phải là loại trạng thái duy nhất. Có một số lần khi một chương trình con được tạo trước đó thực sự có thể trả lại ba hoặc nhiều trạng thái khác nhau (Tốt, Bình thường, Xấu, v.v.). Trong những trường hợp đó, bạn chỉ cần sử dụng
public StateEnum TrySendEmailToCustomer()
Tuy nhiên, trong khi Try-Paradigm trả lời một chút câu hỏi này về cách kiểm tra khoảng trống, cũng có những cân nhắc khác. Ví dụ, trong/sau một chu kỳ "TDD", bạn sẽ "Refactoring" và nhận thấy bạn đang làm hai việc với phương pháp của bạn ... do đó phá vỡ "Nguyên tắc trách nhiệm duy nhất". Vì vậy, cần được chăm sóc đầu tiên. Thứ hai, bạn có thể đã idenetified một phụ thuộc ... bạn đang chạm vào "Persistent" dữ liệu.
Nếu bạn đang thực hiện công cụ truy cập dữ liệu trong phương pháp được đề cập, bạn cần phải cấu trúc lại thành kiến trúc n-tier'd hoặc n-layer'd. Nhưng chúng ta có thể giả định rằng khi bạn nói "Các chuỗi sau đó được chèn vào cơ sở dữ liệu", bạn thực sự có nghĩa là bạn đang gọi một lớp logic nghiệp vụ hoặc một cái gì đó. Ya, chúng tôi sẽ giả định điều đó.
Khi đối tượng của bạn được khởi tạo, bây giờ bạn hiểu rằng đối tượng của bạn có phụ thuộc. Đây là khi bạn cần phải quyết định xem bạn sẽ làm Dependency Injection trên Object hay trên phương thức. Điều đó có nghĩa Constructor của bạn hoặc phương pháp-in-câu hỏi cần có một thông số mới:
public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert)
Bây giờ bạn có thể chấp nhận một giao diện của đối tượng kinh doanh/cấp dữ liệu của bạn, bạn có thể thử nó ra trong đơn vị xét nghiệm và không có phụ thuộc hoặc sợ thử nghiệm tích hợp "Tình cờ".
Vì vậy, trong mã trực tiếp, bạn chuyển vào đối tượng REAL IBusinessDataEtc
. Nhưng trong Thử nghiệm Đơn vị của bạn, bạn chuyển vào đối tượng MOCK IBusinessDataEtc
. Trong Mock đó, bạn có thể bao gồm các thuộc tính không giao diện như int XMethodWasCalledCount
hoặc một cái gì đó có (các) trạng thái được cập nhật khi các phương thức giao diện được gọi.
Vì vậy, Bài kiểm tra đơn vị của bạn sẽ đi qua (các) Phương pháp của bạn -In-Question, thực hiện bất kỳ logic nào họ có và gọi một hoặc hai hoặc một bộ phương pháp đã chọn trong đối tượng IBusinessDataEtc
của bạn. Khi bạn làm Assertions của bạn ở phần cuối của bài kiểm tra Unit của bạn, bạn có một vài thứ để kiểm tra ngay bây giờ.
- Trạng thái của "Chương trình con" hiện là phương pháp Try-Paradigm.
- Trạng thái của đối tượng Mock
IBusinessDataEtc
của bạn.
Để biết thêm thông tin về phụ thuộc Tiêm ý tưởng về cấp xây dựng ... khi chúng liên quan đến Kiểm tra đơn vị ... hãy xem xét các mẫu thiết kế Builder. Nó bổ sung thêm một giao diện và lớp cho mỗi giao diện hiện tại/lớp bạn có, nhưng chúng rất nhỏ và cung cấp chức năng HUGE tăng để kiểm tra Đơn vị tốt hơn.
Vui lòng không sử dụng cụm từ "TDD" nếu đó không phải là những gì bạn đang làm. Bạn đang thực hiện Kiểm thử Đơn vị, không phải là TDD. Nếu bạn đang làm TDD, bạn sẽ không bao giờ có một câu hỏi như "làm thế nào để kiểm tra một phương pháp." Bài kiểm tra sẽ tồn tại trước tiên, và sau đó câu hỏi sẽ là, "làm thế nào để có được bài kiểm tra này để vượt qua?" Nhưng nếu bạn đang làm TDD, mã của bạn sẽ được viết cho thử nghiệm (không phải là cách khác xung quanh), và bạn về cơ bản sẽ trả lời câu hỏi của riêng bạn. Mã của bạn sẽ được định dạng khác với kết quả của TDD và vấn đề này sẽ không bao giờ xảy ra. Chỉ cần làm rõ. – Suamere