2016-02-09 25 views
0

我有一種方法將FileInfo對象作爲參數,並檢查相應的文件是否以UTF-8編碼。將FileInfo作爲參數的單元測試方法

我用MSTest寫了一些單元測試,使用添加到UnitTest項目中的實際文本文件,這些文件與DeploymentItem屬性一起部署。然後我創建指向已部署文件的對象,並用它們測試方法。就像這樣:

[TestMethod] 
    [DeploymentItem(@"..\..\Import\UTF8.txt")] 
    public void TestUTF8Detection() 
    { 
     FileInfo fileInfo = new FileInfo("UTF8.txt"); 
     bool isUTF8= FormatVerification.IsUTF8(fileInfo); 
     Assert.IsTrue(isUTF8); 
    } 

不過,我讀過,使用真實文件可能會比較慢和不值得信任(如herehere),所以我想我會怎麼做這個嘲諷的文件。我想我會:

  • 創建一個子方法,將實際上測試,而不是原來 其中一個只是調用它,這需要作爲參數 FileStream,而不是一個FileInfo
  • 創建一個FileStream UTF-8編碼(或不),並將其傳遞給子方法。

所以,我有一些問題,從更具體到更一般:

  1. 我怎樣才能創建一個沒有真正從文件讀取UTF-8編碼的FileStream對象?
  2. 創建此子方法是允許嘲笑文件的唯一替代方法嗎?
  3. 原始方法怎麼樣?我可以用某種方式測試它嗎?
  4. 創建這種子方法(只允許單元測試)被認爲是一種好的做法嗎?
  5. 我是否真的應該儘量避免在單元測試中使用真實文件,或者有沒有像這樣的例子證明它是正確的?
+0

[單元測試文件I/O]的可能重複(http://stackoverflow.com/questions/1528134/unit-testing-file-io) –

+1

請添加'IsUTF8'方法的實現,所以我會能夠回答你的問題.... –

回答

0

我想最好的辦法是抽象的FileInfoIMyFileInfo連同工廠,創建這些文件名從(也就是說,它創建原始FileInfo加上包裝)。

然後測試可以創建一個模擬IMyFileInfo)。你的界面/包裝應該在IsUTF8之內公開你需要的FileInfo

生產代碼應該使用工廠而不是new來創建包裝而不是真正的FileInfo s。

1

FileInfo是密封的,所以你不能做繼承和覆蓋的伎倆。

我會使用類似SystemWrapper的東西,或者像Haukinger所建議的那樣,使用我自己的FileInfo接口,然後一旦代碼依賴於接口,應該很容易模擬所需的行爲。

相關問題