2012-03-28 112 views
1

的方法,我有以下方法:如何進行單元測試有文件名作爲參數

public static IEnumerable<Customer> GetStuff(string fileName,int filterValue) 

你將如何單元測試嗎?顯然,我的問題是fileName參數。

謝謝!

+2

我沒有得到你的問題。什麼阻止你傳遞一個虛擬文件名作爲參數? – Zenwalker 2012-03-28 04:53:34

+0

我不知道爲什麼它應該很明顯,你的問題是'fileName'參數。 'fileName'沒有什麼特別的地方讓我相信你有問題,那麼爲什麼它是你的問題? – Kiril 2012-03-28 05:00:50

+0

@zenwalker在某些方法我從某個文件讀取數據,並做一些處理,請讓我知道我可以做到這一點,而不會傳遞fileName作爲參數 – 2012-03-28 05:04:46

回答

2

爲了讓另一個答案,嘗試:我想打theJollySin問題,但並沒有解釋不夠(恕我直言)

你似乎採取fileName並擊中了系統的文件系統中的GetStuff方法。如果你想對它進行單元測試,那就是問題所在。 你必須與你的文件系統(打開/創建/閱讀下載文件等)做的事情推到一個接口或東西,然後嘲笑這一點。 一個例子可能是:

public interface IMyFileIO 
{ 
    public byte[] ReadFromFile(int bytes); // whatever 
} 

public static IEnumerable<Customer> GetStuff(IMyFileIO file, int filterValue) 
{ 
} 

然後用嘲諷的框架(例如像MOQ)嘲笑IMyFileIO

[Test] 
public void TestFileIO() 
{ 
    var mock = new Mock<IMyFileIO>(); 
    mock.Setup(foo => foo.ReadFromFile(2)).Returns(new byte[]{2,3}); 

    var myResult = MyClass.GetStuff(mock.Object, 10); 
    Assert. // <- what you need to check 
} 

請注意,這取決於你在做什麼,機會是很高,已經有一個interace /基類提供您需要的功能(StreamWriter的,等等)

+0

感謝卡斯滕,這就是我一直在尋找的,是的,我會在我的情況下使用的StreamWriter。再次感謝 – 2012-03-28 05:07:53

0

我假設的問題是,該方法出去的文件系統來獲取文件? 我會爲前提,以實際測試爲您的方法來獲取...然後你可以在新創建的文件名來測試通過的文件。 它在這一點上變成了一個集成測試,但它仍然適用於測試目的。這只是不是一個「純粹」的單元測試

+0

如果您正確處理每個測試運行的唯一文件名,測試也可以重新運行。每當我需要一些獨特的東西時,我傾向於使用GUID。您可以清除在啓動文件夾以未累積的文件1000nds :-) – TGH 2012-03-28 05:02:42

+0

感謝TGH,是的,這將是某種集成測試,我試圖避免,如果可能的 – 2012-03-28 05:06:34

+0

好吧,我猜嘲弄之一在其他答覆中描述的方法會服務你最好然後:-) – TGH 2012-03-28 05:10:15

2

我會親自去改變的方法到更多的東西一般喜歡

public static IEnumerable<Customer> GetStuff(Stream dataStream,int filterValue) 

這將使您能夠使用模擬流或MemoryStream的代替的FileStream的能力取數據並且單元測試正確。另外,我個人建議儘可能使用方法(Stream vs filePath就是一個很好的例子)。

+0

謝謝,就是它 – 2012-03-28 05:08:51

+0

不客氣。 :) – 2012-03-28 05:09:37