2016-08-14 33 views
3

我有一個控制器,其職責是將與請求一起傳遞的文件(通過正文POST)複製到web/images下的特定路徑。路徑由生活在特定的Controller中的物業指定。如何在功能測試中模擬文件副本

我想這樣做是有功能測試測試它,但我不希望它在我的項目覆蓋文件,所以我想用vfs或路徑更改我的測試用例之前發送請求。

有沒有一個很好的方法來實現這一目標?

+0

*「但我不希望它覆蓋我的項目中的文件」* - 這聽起來像你做錯了什麼。確保代碼寫入僅用於此目的的目錄(最初爲空)。而且你不在生產環境中運行測試,是嗎?最後,如果你想測試*「控制器的職責是複製文件」*我認爲最好不要模擬文件系統,而是使用真正的文件系統。否則,你測試什麼?模擬的行爲? – axiac

+0

這部分是真的,它總是取決於你需要測試什麼,讓我們不要把我們的思想轉變成一個自以爲是的解決方案:) 如果控制器的職責是覆蓋放置在特定路徑中的文件,並且git追蹤原始默認文件,我想測試的是*控制器根據指定的路徑替換文件*,但我希望親愛的舊原始默認文件不被觸及。缺少的是可以在測試和質量環境中進行測試的原始路徑。但是對於TDD開發,我認爲這個測試可能還不錯:我正在測試行爲 – Bertuz

回答

0

我會盡量回答自己:我重構我的代碼,以便有一個屬性,指定我想要複製/覆蓋我的文件的路徑。

然後,在一個PHPUnit類中,我用vfsStream路徑替換對象屬性的值。通過這樣做,我得到了我需要的行爲,而無需觸摸我的真實文件/路徑。所有東西都將存在於虛擬文件系統中,我的對象將使用它。

參數對於一個乾淨且可重用的代碼來說很重要,但是當你想進行單元測試時,這個參數更重要:我認爲單元測試正在幫助我強制參數化一切,以便在沒有時重新進行硬編碼很多時間。爲了幫助我編寫單元測試,我創建了一個訪問方法和屬性的類,而不管它們的可訪問性。

PHPUnitUtils

我肯定有已經一些更復雜的,但這個類fullfills我在這個非常時刻需要。希望它有助於:-)

0

一種常見的方法是加載可能在環境之間作爲環境變量而改變的配置。 (我沒有以前使用的symfony,所以有可能的工具來幫助ENV瓦爾)

上傳路徑便可設爲

$upload_path = getenv('WEB_IMAGE_UPLOAD_PATH') ? 
    getenv('WEB_IMAGE_UPLOAD_PATH') : 'web/images' 

這將允許你指定一個臨時(/tmp?)目錄在集成模式下啓動服務器時。


阿涼,(免責聲明:我不是一個PHP的人),它看起來像PHP有可能能夠在功能測試中提供幫助,並可以方便的清理IO流。

http://php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-unknown-unknown-descriptios

我相信你可以設置你的「WEB_IMAGE_UPLOAD_PATH」是那些流的一個

+0

謝謝你的建議!最後我找到了自己的方式,並將其記錄在一個專門的答案中。隨時在下面發表評論 – Bertuz

相關問題