應對類進行重構,以消除對實現問題的嚴密耦合,從而使測試變得困難。
//...Creat an abstraction that provides the desired behavior as a contract
public interface IDirectoryService {
IEnumerable<string> EnumerateFiles(string path, string searchPattern);
}
測試時可以創建假/模擬以避免與單獨測試IO代碼相關的缺陷。
甲模擬框架可能已被用於捻熄的依賴關係,但使用一個簡單的
現在需要重構
public class FakeDIrectoryService : IDirectoryService {
IEnumerable<string> files;
public FakeDIrectoryService(IEnumerable<string> files) {
this.files = files;
}
public IEnumerable<string> EnumerateFiles(string path, string searchPattern = null) {
return files;
}
}
類這個例子遵循通過構造和方法注射Explicit Dependencies Principle。
public class DemoCls {
IDirectoryService directory;
public DemoCls(IDirectoryService directory) {
this.directory = directory;
}
public void Execute(string dataFolder) {
foreach (var x in directory.EnumerateFiles(dataFolder, "test*.xml")) {
//...
}
}
}
現在可以單獨適當地執行測試。
[TestClass()]
public class DemoClsTests {
[TestMethod()]
public void ExecuteTest() {
//Arrange
var fakePath = "C:/temp";
var fakeFiles = new[] {
@"C:\\temp\\testfakefilename1.txt",
@"C:\\temp\\testfakefilename2.txt",
@"C:\\temp\\testfakefilename3.txt"
};
var service = new FakeDIrectoryService(fakeFiles);
var sut = new DemoCls(service);
//Act
sut.Execute(fakePath);
//Assert
//perform your assertions
}
}
最後生產代碼文件服務的真正實現可以包裝任何來源,無論是磁盤或遠程服務。
例如
public class FileService : IDirectoryService {
public IEnumerable<string> EnumerateFiles(string path, string searchPattern) {
return Directory.EnumerateFiles(path, searchPattern);
}
}
這只是什麼可以做一個例子。有很大的改進空間,但這應該讓事情開始。
嘗試以管理員身份運行您的應用程序。也許這是一個特權問題 –
在代碼中設置硬編碼,不可配置的路徑只是非常糟糕的設計。 – Evk
你在這裏測試什麼? –