Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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