2010-08-04 64 views
16

我正在使用simpleTest編寫我的PHP測試。我正在寫一個文件上傳插件,並想知道我可能會如何測試它。如何在PHP中編寫文件上傳測試?

我想檢查文件正確上傳,在正確的文件夾,在需要時正確地返回錯誤等

如何模擬文件上傳(通過$ _FILES變量)?我應該注意哪些問題?

回答

25

我找到了一個替代解決方案。我使用測試數據欺騙了$_FILES陣列,在tmp/文件夾中創建了虛擬測試文件(該文件夾無關緊要,但我試圖堅持使用默認設置)。

問題是is_uploaded_filemove_uploaded_file無法與這個欺騙項目一起工作,因爲它們並沒有通過POST真正上傳。 我做的第一件事就是將這些函數包裝在我自己的插件moveUploadedFileisUploadedFile中,這樣我就可以嘲笑它們並更改它們的返回值。

的最後一件事是測試它和覆蓋moveUploadedFile使用rename而不是move_uploaded_fileisUploadedFile使用file_exists,而不是is_uploaded_file時擴展的類。

+2

你能顯示一段代碼嗎? – Jhn 2014-09-19 06:13:24

+2

擴展此答案以及如何模擬move_uploaded_file中文件的移動會非常有幫助。 – 2014-12-01 09:55:47

+0

@pixelastic你有可能向我們展示你的代碼嗎? – Magiranu 2017-11-18 17:17:21

5

您可以通過編程方式生成文件上傳,例如,擴展名爲curl

由於這需要PHP在Web服務器下運行,所以它不是什麼單元測試。因此,最好的方法是使用PHPT測試並用數據填充--POST_RAW-- section

如果您不知道如何放入--POST_RAW--,請嘗試安裝TamperData Firefox擴展,從Firefox執行文件提交,然後從右側複製粘貼數據。

+0

正如你所說,cURL對於單元測試並不是很好。我閱讀了PHPT文檔,我認爲這可能是更好的解決方案。不幸的是我沒有設法得到它的工作...我終於找到了其他解決方案(請參閱我的答案) – pixelastic 2010-08-04 23:28:05

+0

我也嘗試使用PHPT和--POST_RAW--但無法讓它工作,如記錄在這裏: http://stackoverflow.com/questions/4974727/phpt-unable-to-run-sample-tests-that-use-post-raw – Ian 2011-02-12 04:27:44

7

根據該文件,SimpleTest has support for FileUpload testing baked in since version 1.0.1:

File upload testing  Can simulate the input type file tag 1.0.1 

我看過了的例子在他們的網站上,並會認爲你會使用的東西沿着

$this->get('http://www.example.com/'); 
$this->setField('filename', 'local path'); 
$this->click('Go'); 

行提交的文件然後使用常規斷言來檢查上載是否按要求工作。但是這真的只是一個瘋狂的猜測,因爲我不熟悉SimpleTest,我無法在他們的主頁上找到一個例子。你可能想要ask in their support forum though.

但基本上,沒有太多的使用測試表單上傳文件。這是經過驗證的瀏覽器行爲。測試處理上傳的代碼更有意義。我不知道你是如何實現你的FileUpload代碼的,但是如果我必須實現這個,我會擺脫$_FILES數組的依賴關係作爲第一件事。創建一個FileRequest類,您可以將$_FILES數組傳遞給。然後,您可以處理該課程的上傳。這將允許您在不實際上傳文件的情況下測試功能。只需相應地設置您的FileRequest實例即可。你甚至可以用vfsStreamWrapper來模擬文件系統,所以你甚至不需要實際的文件。

+0

我想只能測試我的插件的一小部分。做一個完整的獲取請求不會讓我達到我需要的詳細程度。 – pixelastic 2010-08-04 23:28:41

-3

對於單元測試(與功能測試相對),嘗試將文件(短文本文件)上傳到測試頁面,然後嘗試上傳var_dump($_FILES)var_dump($_POST)。然後你知道用什麼來填充他們(或你的嘲笑)。

+4

is_uploaded_file將仍然失敗 – 2012-01-28 20:39:09