Các kiểu trả về trống / Chương trình con là tin cũ. Tôi đã không thực hiện kiểu trả về Void (Trừ khi tôi cực kỳ lười biếng) trong vòng 8 năm (Từ thời điểm 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 thức như:
public void SendEmailToCustomer()
Tạo một phương thức theo mô hình int.TryPude () của Microsoft:
public bool TrySendEmailToCustomer()
Có thể không có bất kỳ thông tin nào mà phương thức của bạn cần trả về để sử dụng trong thời gian dài, nhưng việc trả lại trạng thái của phương thức sau khi nó thực hiện công việc của nó là một công dụng rất lớn đối với 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ả về 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 phần nào trả lời câu hỏi này về cách kiểm tra trả lại khoảng trống, thì cũng có những cân nhắc khác. Ví dụ: trong / sau chu kỳ "TDD", bạn sẽ "Tái cấu trúc" và nhận thấy bạn đang làm hai việc với phương pháp của mình ... 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ể đã xác định được sự phụ thuộc ... bạn đang chạm vào Dữ liệu "Liên tục".
Nếu bạn đang thực hiện các công cụ truy cập dữ liệu trong câu hỏi phương thức, bạn cần 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ả sử 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ẽ cho rằng.
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ó các phụ thuộc. Đây là khi bạn cần quyết định xem bạn sẽ thực hiện Dependency Injection trên Object hay trên Phương thức. Điều đó có nghĩa là Trình xây dựng của bạn hoặc phương thức trong câu hỏi cần một Tham số mới:
public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert)
Giờ đây, bạn có thể chấp nhận giao diện của đối tượng tầng dữ liệu / doanh nghiệp của mình, bạn có thể mô phỏng nó trong Kiểm tra đơn vị và không phụ thuộc hoặc sợ thử nghiệm tích hợp "Tình cờ".
Vì vậy, trong mã sống của bạn, bạn vượt qua trong một IBusinessDataEtc
đối tượng THỰC SỰ . Nhưng trong Kiểm tra đơn vị của bạn, bạn vượt qua trong một IBusinessDataEtc
đối tượng MOCK . 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ó 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 thức của bạn, thực hiện bất kỳ logic nào họ có và gọi một hoặc hai hoặc một nhóm phương thức được chọn trong IBusinessDataEtc
đối tượng của bạn . Khi bạn thực hiện các Xác nhận của mình khi kết thúc Bài kiểm tra đơn vị, bạn có một vài điều cần 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 Thử-Nghịch lý.
- Trạng thái của
IBusinessDataEtc
đối tượng Mock của bạn .
Để biết thêm thông tin về các ý tưởng Tiêm phụ thuộc ở cấp độ Xây dựng ... khi chúng liên quan đến Thử nghiệm đơn vị ... hãy xem xét các mẫu thiết kế của Builder. Nó bổ sung thêm một giao diện và lớp cho mỗi giao diện / lớp hiện tại mà 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.