2009-01-19 91 views
2

你有一個類的方法有2個參數,其中一個是文件路徑,另一個是不相關的。單元測試,重構,IO

InterestingResult result = foo.Bar(irrelevant, filePathInfo); 

在具有快速活潑的單元測試的精神,你會發現自己考慮重構這個方法拉出刪除此測試的IO要求的文件路徑...最有可能把它變成另一種方法,所以那現在你會打電話

string dataInFile = foo.GetDataInFile(filePathInfo); 
InterestingResult result = foo.Bar(irrelevant, dataInFile); 

你瘋了嗎?......還是這是件好事?

回答

6

如何使用Stream作爲參數?這樣,您可以在單元測試中通過MemoryStream,在生產代碼中通過FileStream

+0

流是要走的路。路徑接口可能會令人生氣。如果你需要尋求支票流.CanSeek並適當拋出。 – plinth 2009-01-19 17:03:31

0

作爲一般規則,我將避免僅爲了測試目的而改變接口。接口應該反映用戶的需求,而不是開發人員或測試人員的需求。

+0

「作爲一般規則,我將避免僅爲了測試目的而更改接口。」......對,您應該首先設計它進行測試。 – 2009-01-19 19:44:16

0

取決於你問誰。有人會說設計進行測試。我不會爲了適應測試而改變我的設計。

但在這種情況下,我更改我的設計,使Foo方法採用流而不是文件路徑。這樣它更加靈活,你的單元測試可以傳入一個虛擬流。

0

我可能會設計這樣的接口,而不是採取文件路徑,我會傳入一個IStream(或類似的)指針。通過這種方式,您可以使用模擬庫進行測試,以傳入滿足該方法的模擬IStream,並提供更強的測試。

0

最簡單的工作。

  • 爲您的測試,爲提供您知道預期的輸出(只讀)golden file(其存儲在測試/參考資料)。如果速度足夠快,則無需更改生產代碼。
  • 如果測試命中FileSystem的速度太慢(超過半秒),那麼請抽出FileSystem Access(使用Mock/Fake)(類似於您的問題中的第二個片段)。

隨着您獲得更多的n更多的測試感染,您會開發出一種蜘蛛感覺的東西,這些東西會相應地進行測試和設計。所以,要保持它...