回答
單元測試應該證明一個代碼單元在中正確運行,完全隔離。如果您的測試依賴於文件系統正常運行才能通過,那麼您的測試並不理想,並且可能會在任何給定的測試運行中對您說謊。
與其他實驗一樣,當您有多個變量參與時,您無法確定結果。對於與文件系統交互的PHP代碼,最好使用自定義流包裝器來模擬文件系統(通常爲vfsStream,但如果您真的想要,可以輕鬆編寫自己的流包裝器)。
$noTest < $testWithFileSystemDependency < $testThatMocksFileSystem
通常,這是通過傳遞文件路徑爲直接使用它們的方法來完成:
<?php
function myFunction($someFilePath) {
// do stuff
}
通過這種方式,你可以模擬文件系統,並通過在一個可測試的虛擬路徑這會表現你如何嘲笑它的行爲。
你寫兩個測試。一個創建該文件,並期望您的方法成功,另一個確保該文件不存在,並期望您的方法失敗。
你的函數在退出之前是否刪除文件? –
第一個沒有,第二個沒有。或者,如果您的設置是有效的,請使用'setUp()'和'tearDown()'確保一致的測試條件。 – Gutza
就我個人而言,我只是在tests目錄下創建_files
目錄並在那裏創建文件。或在/tmp
。
有一種方法來模擬fs:http://www.phpunit.de/manual/current/en/test-doubles.html#test-doubles.mocking-the-filesystem,但從我的經驗 - 我更喜歡真正的FS操作(在這種情況下)。
- 1. 導入模塊測試
- 2. 如何從父目錄導入模塊? (單元測試目的)
- 3. 的Python:單元測試模塊和相對導入
- 4. Monkey-patch一個由TON文件導入的模塊(單元測試)
- 5. 導入錯誤與單元測試和多次模塊
- 6. Python - 如何導入單元測試模塊?
- 7. Python單元測試導入模塊與nostest
- 8. 無法導入模塊:文件resource.robot中出錯':導入測試庫失敗:ModuleNotFoundError:沒有名爲'helper'的模塊
- 9. 根據測試導入被測模塊而不是模塊級導入?
- 10. 導入/導出模塊 - Typescript
- 11. 使用pytest導入資源進行單元測試:模塊級或測試級?
- 12. TypeScript - 條件模塊導入/導出
- 13. Google Push-To-Deploy Pipelines - 單元測試失敗,出現模塊導入錯誤
- 14. 如果測試導入模擬文件
- 15. HowTo測試模塊導出分支?
- 16. 角度2.0.0 - 測試「模塊導入'DynamicTestModule'」
- 17. Python,導入模塊進行測試
- 18. 導出XML方法的單元測試
- 19. DNN模塊導入文件
- 20. 燒瓶模塊從測試文件夾導入失敗
- 21. 導入導入主模塊的模塊
- 22. 單元測試:模塊重新導出可避免必須「暴露」所有可測試模塊
- 23. 將__init__.py導入單元測試包
- 24. Python單元測試導入問題
- 25. Python,單元測試和嘲諷導入
- 26. Python單元測試和導入錯誤
- 27. 從單元測試代碼導入包
- 28. ES6中模塊的導入和導出
- 29. Gradle Android單元測試與模塊依賴導致NoClassDefFoundError
- 30. 單元測試模塊javascript
爲了清楚起見,爲什麼要用虛擬FS一路走,而不是用PHP自己的'tempnam()'和朋友創建一個臨時目錄? – Gutza
@Gutza問題在於即使它是一個臨時文件,它仍然依賴於文件系統正常工作才能使用它。 vfsStream的意義在於你的模擬「文件系統」保存在內存中。另一個好處是,當你處理一個包含很多測試的大型測試套件時,通常可以通過不在任何地方敲擊磁盤來顯着加速測試運行。 – rdlowrey