2010-08-04 4 views
16

Я использую simpleTest для написания своих тестов PHP. Я пишу плагин для загрузки файлов и задавался вопросом, как я могу его тестировать.Как написать тесты для загрузки файлов в PHP?

Я хотел бы проверить, что файл правильно загружен в нужную папку, что ошибка правильно возвращается, когда это необходимо, и т.д.

Как эмулировать файл загрузки (через переменную $ _FILES)? Есть ли какие-то проблемы, о которых я должен знать?

ответ

25

Я нашел альтернативное решение. Я подделал массив $_FILES с тестовыми данными, создал фиктивные тестовые файлы в папке tmp/ (папка не имеет значения, но я пытался придерживаться значения по умолчанию).

Проблема была в том, что is_uploaded_file и move_uploaded_file не могли работать с этими поддельными товарами, потому что они действительно не загружены через POST. Первое, что я сделал, - это обернуть те функции внутри моих собственных moveUploadedFile и isUploadedFile в моем плагине, чтобы я мог их высмеять и изменить их возвращаемое значение.

Последнее, что было расширяет класс при тестировании его и перезапись moveUploadedFile использовать rename вместо move_uploaded_file и isUploadedFile использовать file_exists вместо is_uploaded_file.

+2

Можете ли вы показать фрагмент кода? – Jhn

+2

Расширение этого ответа на то, как издеваться над перемещением файлов в файле move_uploaded_file, было бы очень полезно. –

+0

@pixelastic Любой шанс, что вы могли бы показать нам свой код для этого? – Magiranu

5

Вы можете сгенерировать загрузку файла программным способом, например. расширение curl.

Поскольку для этого требуется PHP, работающий под веб-сервером, это не большая часть единичного теста. Следовательно, наилучшим способом было бы использовать тесты PHPT и заполнить данные --POST_RAW-- section.

Если вы не знаете, что положить в --POST_RAW--, попробуйте установить расширение TamperData Firefox, выполните отправку файлов из Firefox и скопируйте данные с правой стороны.

+0

Как вы сказали, cURL не так хорош для модульного тестирования. Я прочитал документацию PHPT, и я думаю, что это может быть лучшим решением. К сожалению, мне не удалось заставить его работать ... Наконец-то я нашел другое решение (см. Мой ответ) – pixelastic

+0

Я также пытался использовать PHPT и -POST_RAW--, но не смог заставить его работать, как описано здесь: http://stackoverflow.com/questions/4974727/phpt-unable-to-run-sample-tests-that-use-post-raw – Ian

7

Согласно Docs, 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

-3

Для тестирования модулей (в отличие от функционального тестирования) попробуйте загрузить файл (короткий текстовый файл) на тестовую страницу и var_dump($_FILES) и var_dump($_POST). Тогда вы знаете, что заполнить их (или ваши издевательства).

+4

is_uploaded_file по-прежнему не работает –