Tôi bắt đầu tham gia vào Bài kiểm tra đơn vị, Dependancy Injection và tất cả nhạc jazz đó trong khi xây dựng dự án ASP.NET MVC mới nhất của tôi.Làm thế nào để bạn có thể kiểm tra bộ điều khiển của bạn mà không cần một thùng chứa IoC?
Tôi đến thời điểm hiện tại tôi muốn Unit Test my Controllers và tôi đang gặp khó khăn trong việc tìm ra cách thực hiện một cách phù hợp mà không cần thùng chứa IoC.
Đưa ví dụ như một bộ điều khiển đơn giản:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository = new SqlQuestionsRepository();
// ... Continue with various controller actions
}
Lớp này không phải là rất đơn vị kiểm chứng vì instantiation trực tiếp của SqlQuestionsRepository. Vì vậy, hãy đi xuống tuyến đường Dependancy Injection và thực hiện:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository repository)
{
_repository = repository;
}
}
Điều này có vẻ tốt hơn. Bây giờ tôi có thể dễ dàng viết các bài kiểm tra đơn vị với một IQuestionsRepository giả lập. Tuy nhiên, điều gì sẽ được thực hiện ngay bây giờ? Một nơi nào đó tiếp tục chuỗi cuộc gọi SqlQuestionRepository sẽ phải được khởi tạo. Có vẻ như thông qua tôi chỉ đơn giản là chuyển vấn đề ở nơi khác, không được loại bỏ nó.
Bây giờ, tôi biết đây là một ví dụ điển hình về nơi chứa IoC có thể giúp bạn bằng cách kết nối các phụ thuộc Bộ điều khiển cho tôi trong khi đồng thời giữ bộ điều khiển dễ dàng kiểm tra được.
Câu hỏi của tôi là, làm cách nào để thử nghiệm đơn vị về những thứ có tính chất này mà không cần vùng chứa IoC?
Lưu ý: Tôi không phản đối các thùng chứa IoC, và tôi có thể sẽ sớm đi xuống con đường đó. Tuy nhiên, tôi tò mò về cách thay thế cho những người không sử dụng chúng.
@Peter, đề xuất rất tốt. Bạn đã có bất kỳ kinh nghiệm với việc sử dụng container IoC trên các dự án của bạn hoặc có bạn không tìm thấy một nhu cầu chưa? – mmcdole
Tôi không có nhiều kinh nghiệm .NET, hầu hết công việc của tôi là với Java sử dụng Spring cho IoC. Nó đã rất hữu ích cho việc cải thiện mô đun. – Peter
@Peter: Đây là mẫu khá nhiều mà tôi sử dụng. Tôi đã đăng một câu trả lời mà làm điều tương tự, nhưng sử dụng một số tính năng ngôn ngữ C# mà bạn, là một anh chàng Java, có thể không được nhận thức. –