2010-10-29 5 views
0

test des problèmes ayant un groupe (travail) télécharger dans mon application Rails (en utilisant 2.3.8):le téléchargement de fichiers de test dans Rails: ne peut pas convertir ActionController :: TestUploadedFile en chaîne

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 

Le contrôleur attribue juste la params en vrac

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

modèle utilise Joint pour gérer les téléchargements:

class Profile 
    include MongoMapper::Document 
    plugin Joint 

    attachment :avatar 
end 

Obtenir cette erreur lors de l'exécution du test:

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' 

Ce qui donne? Apparemment, l'avatar = setter traitera de vrais fichiers téléchargés, mais ne traitera pas avec TestUploadedFile.

Répondre

1

Peut-être que le fichier de téléchargement de test de rails actioncontroller ne fonctionne pas pour une raison quelconque avec File.size?

Ceci est la seule ligne qui traite de la taille: http://github.com/jnunemaker/joint/blob/master/lib/joint.rb#L46

Essayez de faire File.size (...) où ... est le téléchargement de fichiers de montage. Voir si ces erreurs. Si oui, alors peut-être que les rails doivent être modifiés.

J'utilise en fait quelque chose comme ça souvent lors du test de téléchargement de fichiers:

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 

pas la plus jolie, mais il fait le travail.

+0

Merci John. Cela me semble plus joli que http://ap.rubyonrails.org/classes/ActionController/TestUploadedFile.html :) et j'avais oublié que c'était File.size qui barrait sur le fichier de test. – oliverbarnes

Questions connexes