Q1:
Bạn có ba tùy chọn ở đây.
Tùy chọn 1: Sống với nó.
(không Ví dụ: P)
Phương án 2: Tạo một trừu tượng nhẹ nơi cần thiết.
Thay vì làm tệp I/O (File.ReadAllBytes hoặc bất kỳ) trong phương pháp đang thử nghiệm, bạn có thể thay đổi nó để IO được thực hiện bên ngoài và thay vào đó luồng được truyền.
public class MyClassThatOpensFiles
{
public bool IsDataValid(string filename)
{
var filebytes = File.ReadAllBytes(filename);
DoSomethingWithFile(fileBytes);
}
}
sẽ trở thành
// File IO is done outside prior to this call, so in the level
// above the caller would open a file and pass in the stream
public class MyClassThatNoLongerOpensFiles
{
public bool IsDataValid(Stream stream) // or byte[]
{
DoSomethingWithStreamInstead(stream); // can be a memorystream in tests
}
}
Cách tiếp cận này là một sự cân bằng. Thứ nhất, có, nó là testable hơn. Tuy nhiên, nó giao dịch testability cho một sự bổ sung nhỏ để phức tạp. Điều này có thể đạt đến khả năng bảo trì và số lượng mã bạn phải viết, cộng với bạn chỉ có thể di chuyển vấn đề kiểm tra của mình lên một cấp. Tuy nhiên, theo kinh nghiệm của tôi, đây là một cách tiếp cận cân bằng, tốt đẹp khi bạn có thể khái quát hóa và làm cho testable logic quan trọng mà không tự cam kết với một hệ thống tập tin được gói đầy đủ. I E. bạn có thể khái quát hóa các bit bạn thực sự quan tâm, trong khi vẫn để phần còn lại.
Lựa chọn 3: Quấn toàn bộ hệ thống tập tin
Lấy nó một bước xa hơn, chế giễu hệ thống tập tin có thể là một cách tiếp cận hợp lệ; nó phụ thuộc vào bao nhiêu bloat bạn sẵn sàng để sống với.
Tôi đã đi tuyến đường này trước đây; Tôi đã thực hiện hệ thống tệp được bao bọc, nhưng cuối cùng tôi đã xóa nó.Có những khác biệt nhỏ trong API, tôi đã phải tiêm nó ở khắp mọi nơi và cuối cùng nó là thêm đau đớn vì lợi ích ít khi nhiều lớp sử dụng nó không vô cùng quan trọng đối với tôi. Nếu tôi đã sử dụng một container IoC hoặc viết một cái gì đó mà là rất quan trọng và các bài kiểm tra cần thiết để được nhanh chóng tôi có thể đã bị mắc kẹt với nó, mặc dù. Giống như tất cả các tùy chọn này, số dặm của bạn có thể thay đổi.
Đối với câu hỏi container IoC của bạn:
Tiêm thử nghiệm của bạn đôi tay. Nếu bạn phải làm rất nhiều công việc lặp đi lặp lại, chỉ cần sử dụng phương pháp thiết lập/nhà máy trong các bài kiểm tra của bạn. Sử dụng một container IoC để thử nghiệm sẽ là quá mức cần thiết trong cùng cực! Có lẽ tôi không hiểu câu hỏi thứ hai của bạn, mặc dù.
hay không sử dụng DI cho kiểm tra đơn vị phải là một câu hỏi riêng biệt ihmo. –
Tôi khuyên bạn nên sử dụng DI ** khoảng thời gian ** (xem [bài viết này] (http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx) và các liên kết mà nó liên kết đến) –