Как я могу написать тесты для загрузки файлов в PHP? - PullRequest
16 голосов
/ 04 августа 2010

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

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

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

Ответы [ 4 ]

27 голосов
/ 05 августа 2010

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

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

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

9 голосов
/ 04 августа 2010

Согласно Документам, SimpleTest поддерживает тестирование FileUpload начиная с версии 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 и не могу найти пример на их домашней странице.Возможно, вы захотите спросить на их форуме поддержки.

Но, в принципе, не так уж много пользы для тестирования того, что форма загружает файл.Это проверенное поведение браузера.Тестирование кода, который обрабатывает загрузку, имеет больше смысла.Я не знаю, как вы реализовали свой код FileUpload, но если бы мне пришлось это реализовать, я бы сначала избавился от зависимости от массива $_FILES.Создайте класс FileRequest, в который вы можете передать массив $_FILES.Затем вы можете обработать загрузку из класса.Это позволит вам проверить функциональность без фактической загрузки файла.Просто настройте свой экземпляр FileRequest соответственно.Вы даже можете издеваться над файловой системой с помощью vfsStreamWrapper , поэтому вам даже не нужны реальные файлы.

5 голосов
/ 04 августа 2010

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

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

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

0 голосов
/ 28 октября 2010

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

...