Rails Функциональный тестовый пример и загрузка файлов в ActionDispatch:: Http:: UploadFile
Я добавляю тесты в приложение Rails, которое удаляет файлы. Я использую функциональные тесты Rails по умолчанию. Как добавить файлы к ним? У меня есть:
test "create valid person" do
post(:create, :person => { :avatar => fixture_file_upload('avatar.jpeg') })
end
Это почему-то загружает Tempfile
и приводит к сбою при создании AWS/S3
gem с помощью:
NoMethodError: undefined method `bytesize' for Tempfile
Является ли это тем, что я могу получить тест, чтобы использовать ActionDispatch::Http::UploadedFile
и выполнять больше, как при тестировании с помощью веб-браузера? Является ли fixture_file_upload
способ проверки загрузки файлов на контроллер? Если да, то почему он не работает, как браузер?
В качестве примечания я действительно не хочу переключать тестовые рамки. Спасибо!
Ответы
Ответ 1
Я использую s3 gem вместо драгоценного камня aws/s3. Основными причинами этого являются отсутствие поддержки европейских ведер, и развитие aws/s3, по-видимому, прекращается.
Если вы хотите протестировать загрузку файла, чем правильно использовать метод fixtures_file_upload, он напрямую сопоставляется с Rack:: Test:: UploadedFile.new(вы можете использовать это, если тестовый файл не находится в папке оснастки).
Но я также заметил, что поведение объектов Rack:: Test:: Uploaded не совсем то же, что и объект ActionDispatch:: Http:: UploadedFile (что класс загруженных файлов). Основные методы (original_filename, read, size,...) работают, но есть некоторые отличия при работе с файловым методом. Поэтому ограничьте свой контроллер этими методами, и все будет хорошо.
Другим возможным решением является создание объекта ActionDispatch:: Http:: Uploaded и использование этого так:
upload = ActionDispatch::Http::UploadedFile.new({
:filename => 'avatar.jpeg',
:content_type => 'image/jpeg',
:tempfile => File.new("#{Rails.root}/test/fixtures/avatar.jpeg")
})
post :create, :person => { :avatar => upload }
Ответ 2
Я бы рекомендовал использовать mocks.
Быстрый поиск в Google показывает:
http://www.ibm.com/developerworks/web/library/wa-mockrails/index.html
Вы должны иметь возможность создать объект, который будет реагировать на поведение, которое вы хотите. В основном используется в среде Unit test, поэтому вы можете тестировать свои материалы изолированно, поскольку интеграционные тесты должны полностью выполнять весь стек. Тем не менее, я вижу, что в этом случае было бы полезно издеваться над службой S3, потому что она стоит денег.
Ответ 3
Я не знаком с камнем AWS/S3, но кажется, что вы, вероятно, не используете параметр: avatar. bytesize
определяется на String
в ruby1.9. Что произойдет, если вы вызываете read
в загруженном файле, где вы передаете его в AWS/S3?