Пример функционального теста Rails и выгрузка файлов в ActionDispatch :: Http :: UploadFile - PullRequest
16 голосов
/ 22 декабря 2010

Я добавляю тесты в приложение Rails, которое удаленно хранит файлы. Я использую стандартные функциональные тесты Rails. Как я могу добавить к ним загрузку файлов? У меня есть:

test "create valid person" do
  post(:create, :person => { :avatar => fixture_file_upload('avatar.jpeg') })
end

Это по какой-то причине загружает Tempfile и приводит к сбою гема AWS/S3 с:

NoMethodError: undefined method `bytesize' for Tempfile

Можно ли заставить тест использовать ActionDispatch::Http::UploadedFile и выполнять больше, чем при тестировании в веб-браузере? fixture_file_upload способ проверить загрузку файлов на контроллер? Если так, то почему он не работает как браузер?

Как примечание, я действительно не хочу переключать рамки тестирования. Спасибо!

Ответы [ 3 ]

56 голосов
/ 06 января 2011

Я использую камень s3 вместо камня aws / s3.Основными причинами этого являются отсутствие поддержки европейских сегментов, и кажется, что разработка aws / s3 остановлена.

Если вы хотите проверить загрузку файла, чем использование метода fixtures_file_upload ,отображается непосредственно на Rack :: Test :: UploadedFile.new (вы можете использовать это, если тестовый файл не находится в папке fixtures).

Но я также заметил, чтоповедение объектов файлов Rack :: Test :: Uploaded отличается от поведения объекта ActionDispatch :: Http :: UploadedFile (это класс загружаемых файлов).Основные методы (имя_файла_файла, чтение, размер, ...) все работают, но есть некоторые различия при работе с файловым методом.Поэтому ограничьте свой контроллер этими методами, и все будет хорошо.

Другое возможное решение - создание объекта файла 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 }
0 голосов
/ 03 января 2011

Я не знаком с гемом AWS / S3, но кажется, что вы, вероятно, неправильно используете параметр: avatar. bytesize определяется на String в ruby1.9. Что произойдет, если вы вызовете read в загруженном файле, где вы передадите его в AWS / S3?

0 голосов
/ 22 декабря 2010

Я бы рекомендовал использовать макеты.Быстрый поиск в Google показывает:

http://www.ibm.com/developerworks/web/library/wa-mockrails/index.html

Вы сможете создать объект, который будет реагировать на поведение, которое вы хотите.В основном используется в среде модульных тестов, поэтому вы можете тестировать свои вещи изолированно, поскольку интеграционные тесты должны полностью использовать весь стек.Однако в этом случае я вижу, что было бы полезно смоделировать сервис S3, потому что он стоит денег.

...