Tôi đang viết một thành phần, được cung cấp một tệp ZIP, cần phải:
- Giải nén tập tin.
- Tìm một dll cụ thể trong số các tập tin được giải nén.
- Tải dll đó thông qua sự phản chiếu và gọi một phương thức trên nó.
Tôi muốn đơn vị kiểm tra thành phần này.
Tôi muốn viết mã liên quan trực tiếp đến hệ thống tệp:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Nhưng mọi người thường nói, "Đừng viết các bài kiểm tra đơn vị dựa trên hệ thống tệp, cơ sở dữ liệu, mạng, v.v."
Nếu tôi viết nó theo cách thân thiện với bài kiểm tra đơn vị, tôi cho rằng nó sẽ giống như thế này:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
Yay! Bây giờ nó có thể kiểm tra được; Tôi có thể cung cấp thử nghiệm nhân đôi (giả) cho phương pháp DoIt. Nhưng với chi phí nào? Bây giờ tôi đã phải xác định 3 giao diện mới chỉ để làm cho thử nghiệm này. Và chính xác thì tôi đang thử nghiệm cái gì? Tôi đang kiểm tra rằng chức năng DoIt của tôi tương tác đúng với các phụ thuộc của nó. Nó không kiểm tra rằng tệp zip đã được giải nén đúng cách, v.v.
Nó không cảm thấy như tôi đang thử nghiệm chức năng nữa. Cảm giác như tôi chỉ đang thử nghiệm các tương tác trong lớp.
Câu hỏi của tôi là : cách thích hợp để kiểm tra đơn vị gì đó phụ thuộc vào hệ thống tệp?
chỉnh sửa Tôi đang sử dụng .NET, nhưng khái niệm này cũng có thể áp dụng Java hoặc mã gốc.
myDll.InvokeSomeSpecialMethod();
nơi bạn sẽ kiểm tra xem nó có hoạt động chính xác trong cả tình huống thành công và thất bại không, vì vậy tôi sẽ không kiểm tra đơn vị DoIt
nhưng DllRunner.Run
nói rằng việc lạm dụng một bài kiểm tra UNIT để kiểm tra lại rằng toàn bộ quá trình có hoạt động không một sự lạm dụng có thể chấp nhận được và vì nó sẽ là một thử nghiệm tích hợp giả mạo một bài kiểm tra đơn vị, các quy tắc kiểm tra đơn vị bình thường không cần phải được áp dụng một cách nghiêm ngặt