9

Giả sử rằng lớp Foo của tôi có như sau:Đơn vị kiểm tra constructor tiêm

readonly IService service; 

public Foo(IService service) 
{ 
    if (service == null) 
     throw new ArgumentNullException("service"); 

    this.service = service; 
} 

public void Start() 
{ 
    service.DoStuff(); 
} 

Cho đến nay, tôi có một bài kiểm tra đơn vị cho các nhà xây dựng nơi tôi vượt qua trong null để xác minh rằng một ArgumentNullException bị ném. Tôi có cần một thử nghiệm đơn vị thứ hai cho nhà xây dựng của tôi, nơi tôi vượt qua trong một hợp lệ IService và xác minh rằng this.service được thiết lập (mà sẽ yêu cầu một người truy cập công cộng)?

Hoặc tôi có nên chỉ dựa vào thử nghiệm đơn vị của mình cho phương pháp Start để kiểm tra đường dẫn mã này không?

Trả lời

12

Đặt this.service là chi tiết triển khai, vì vậy bạn chỉ nên kiểm tra xem nó có được sử dụng ở nơi được mong đợi và chỉ kiểm tra điều này thông qua phương thức Start hay không. Vì sợ rằng các xét nghiệm của bạn trở nên giòn.

Bạn chỉ muốn kiểm tra xem dịch vụ của bạn có được sử dụng phù hợp không. Bạn không nên quan tâm làm thế nào nó được lưu trữ.

9

Các thử nghiệm này không cần thiết, vì không có thử nghiệm nào khác thành công khi hàm tạo của bạn không hoạt động.

Và thành thật mà nói, tôi thậm chí không bận tâm để viết những kiểm tra null trong các nhà thầu của tôi nữa. Lý do rất đơn giản: DI container không cho phép bạn tự động kết nối các constructor với tham chiếu null (hoặc ít nhất, không theo mặc định), vì vậy không có khả năng các kiểu được xây dựng bằng cách sử dụng các giá trị null (khi tự động có dây bởi một container) . Vì vậy, nó chỉ thêm mã vô dụng mà làm cho tôi thêm các bài kiểm tra vô ích khi tôi muốn có độ bao phủ mã cao.

Tôi nói bỏ qua các kiểm tra rỗng hoàn toàn này và tin tưởng hộp chứa DI của bạn (hoặc chọn vùng chứa DI mà bạn có thể tin tưởng).

+0

Một việc khác bạn có thể làm là loại bỏ hoàn toàn ctor và để cho nó được tạo ra bởi một mẫu T4, chẳng hạn như dự án này: https://t4ctorgenerator.codeplex.com/. Không cần phải kiểm tra đơn vị mã được tạo ra. – Steven