Тестирование загрузки файлов в Rails: невозможно преобразовать ActionController :: TestUploadedFile в строку - PullRequest
0 голосов
/ 29 октября 2010

Проблемы с тестированием (рабочей) загрузки в моем приложении Rails (с использованием 2.3.8):

class ProfilesControllerTest < ActionController::TestCase
  test "creates a new profile" do
    fixture_image = fixture_file_upload("#{RAILS_ROOT}/test/fixtures/files/avatar.jpg", 'image/jpeg')
    post :create, :profile=>{:username=>'johndoe', 
                             :password=>'mypass',
                             :avatar => fixture_image
                          }, :html => { :multipart => true }
    assert_response :success
    assert_not_nil Profile.find_by_username("johndoe")
    assert_not_nil Profile.find_by_username("johndoe").avatar
  end
end

Контроллер просто назначает параметры оптом

@profile = Profile.new(params[:profile])
@profile.save

Модель использует Joint для обработки загрузок:

class Profile
  include MongoMapper::Document  
  plugin Joint

  attachment :avatar
end

Получение этой ошибки при запуске теста:

1) Error:
  test_creates_a_new_profile(Api::ProfilesControllerTest):
  TypeError: can't convert ActionController::TestUploadedFile into String
  (eval):15:in `size'
  (eval):15:in `avatar='
  /Users/oliver/.rvm/gems/ruby-1.8.7-p302/gems/mongo_mapper-0.8.6/lib/mongo_mapper/plugins/keys.rb:183:in `send'

Что дает? Очевидно, avatar = setter будет работать с реальными загруженными файлами, но не будет иметь дело с TestUploadedFile's.

1 Ответ

1 голос
/ 01 ноября 2010

Может быть, файл загрузки тестового файла rails actioncontroller по какой-то причине не работает?

Это единственная строка, которая имеет дело с размером: http://github.com/jnunemaker/joint/blob/master/lib/joint.rb#L46

Попробуйте выполнить File.size (...) где ... - загрузка файла фикстуры.Смотрите, если это ошибки.Если это так, то, возможно, рельсы нужно настроить.

Я действительно часто использую что-то подобное при тестировании загрузки файлов:

def uploaded_file(path)
  pathname     = Rails.root + 'test/fixtures/' + path
  filename     = File.basename(path)
  tempfile     = Tempfile.new(filename)
  content_type = MIME::Types.type_for(pathname.to_s).to_s

  FileUtils.copy_file(pathname, tempfile.path)

  (class << tempfile; self end).class_eval do
    alias local_path path
    define_method(:original_filename) { filename }
    define_method(:content_type)      { content_type }
  end

  return tempfile
end

Не самая красивая, но она выполняет свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...