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

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

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

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

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

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

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

Согласно документам, 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 , так что вам даже не нужны фактические файлы.

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

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

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

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