2012-08-26 61 views

回答

5

單元測試應該證明一個代碼單元在中正確運行,完全隔離。如果您的測試依賴於文件系統正常運行才能通過,那麼您的測試並不理想,並且可能會在任何給定的測試運行中對您說謊。

與其他實驗一樣,當您有多個變量參與時,您無法確定結果。對於與文件系統交互的PHP代碼,最好使用自定義流包裝器來模擬文件系統(通常爲vfsStream,但如果您真的想要,可以輕鬆編寫自己的流包裝器)。

$noTest < $testWithFileSystemDependency < $testThatMocksFileSystem

通常,這是通過傳遞文件路徑爲直接使用它們的方法來完成:

<?php 
function myFunction($someFilePath) { 
    // do stuff 
} 

通過這種方式,你可以模擬文件系統,並通過在一個可測試的虛擬路徑這會表現你如何嘲笑它的行爲。

+0

爲了清楚起見,爲什麼要用虛擬FS一路走,而不是用PHP自己的'tempnam()'和朋友創建一個臨時目錄? – Gutza

+0

@Gutza問題在於即使它是一個臨時文件,它仍然依賴於文件系統正常工作才能使用它。 vfsStream的意義在於你的模擬「文件系統」保存在內存中。另一個好處是,當你處理一個包含很多測試的大型測試套件時,通常可以通過不在任何地方敲擊磁盤來顯着加速測試運行。 – rdlowrey

1

你寫兩個測試。一個創建該文件,並期望您的方法成功,另一個確保該文件不存在,並期望您的方法失敗。

+0

你的函數在退出之前是否刪除文件? –

+0

第一個沒有,第二個沒有。或者,如果您的設置是有效的,請使用'setUp()'和'tearDown()'確保一致的測試條件。 – Gutza

相關問題