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?