2017-06-01 23 views
1

當我執行我的測試情況下,失敗了不存在我的機器內的路徑和我得到以下錯誤:目錄沒有找到,而單元測試

System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Data1'.

我需要某種假/在這裏模擬通過測試用例還是我們有其他方式來做到這一點?

public class DemoCls 
{ 
    public void Execute() 
    { 
     string dataFolder = @"C:\\Data1"; 
     foreach (string X in Directory.EnumerateFiles(dataFolder, "test" + "*.xml")) 
     { 
     } 
    } 
} 

測試用例

[TestClass()] 
public class DemoClsTests 
{ 
    [TestMethod()] 
    public void ExecuteTest() 
    { 
     var X = new DemoCls(); 
     X.Execute(); 
    } 
} 
+0

嘗試以管理員身份運行您的應用程序。也許這是一個特權問題 –

+3

在代碼中設置硬編碼,不可配置的路徑只是非常糟糕的設計。 – Evk

+1

你在這裏測試什麼? –

回答

2

應對類進行重構,以消除對實現問題的嚴密耦合,從而使測試變得困難。

//...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); 
    } 
} 

這只是什麼可以做一個例子。有很大的改進空間,但這應該讓事情開始。

0

硬編碼的路徑不是件好事,我會推薦兩個選項,因爲該類不是一成不變的。

第一

public class DemoCls 
{ 
    public void Execute(string targetPath) 
    { 
     foreach (string X in Directory.EnumerateFiles(targetPath, "test" + "*.xml")) 
     { 
     } 
    } 
} 

這使事情更加靈活和可重複使用的

第二

public class DemoCls 
{ 
    private string _targetPath; 

    public DemoCls(string targetPath){ 
     _targetPath = targetPath; 
    } 
    public void Execute(string targetPath) 
    { 
     foreach (string X in Directory.EnumerateFiles(targetPath, "test" + "*.xml")) 
     { 
     } 
    } 
} 

這種方式保持Execute方法清潔器(較不優選)

+0

單元測試仍然失敗並尋找不存在的路徑 – user584018

+0

是的,你需要改變路徑到文件的某個地方。 – robjam

0

也許你可以改變你的路徑像"C:\\Data1"@"C:\Data1" 很少有錯過的事情。

+0

很確定你在這裏的錢是正確的,但一個小解釋不會出錯。 – Flater

+0

單元測試仍然失敗,尋找不存在的路徑 – user584018

+0

我不認爲這是問題。這些與字符串文字(@「C:\ Data1」)基本相同,因爲它更難以搞定。 – robjam

相關問題