2010-10-19 4 views
11

J'essaye d'écrire des spécifications pour une fonctionnalité de téléchargement de fichier en utilisant attach_fu. Cependant, l'exemple de code donné par l'auteur pour le test nécessite que j'aie besoin de action_controller/test_process pour que j'aie accès à la classe ActionController::UploadedStringIO. J'ai déjà utilisé ceci dans les rails 2.x mais pour les rails 3, il ne trouve pas le fichier test_process.attachment_fu test dans les rails 3

Comment procéder pour tester la fonctionnalité de téléchargement de fichiers dans les rails 3?

Répondre

23

J'ai été capable d'utiliser fixture_file_upload très bien avec Rails3 et rspec.

Je viens d'ajouter include ActionDispatch::TestProcess au spec_helper.rb, puis passé quelque chose comme ce qui suit comme filedata:

fixture_file_upload(Rails.root.join("spec/support/test.png"), 'image/png') 

EDIT: Quelque chose a changé, je mis à jour le comportement de ce toujours inclure le chemin d'accessoires, de sorte Je suis passé à ceci à la place de fixture_file_upload:

Rack::Test::UploadedFile.new(Rails.root.join("spec/support/test.png"), 'image/png') 
+1

+1 pour le dernier commentaire sur l'utilisation de 'Rack :: Test :: UploadedFile.new'! avec 'inclure ActionDispatch :: TestProcess', j'étais en quelque sorte un comportement étrange avec usine fille ... – gingerlime

4

Je travaille actuellement sur le test des téléchargements de fichiers dans les rails 3, bien que je ne sache pas à quel point ma réponse sera utile. Serait-il possible pour vous de changer le test? Personnellement, j'utilise une approche Cucumber/Capybara. DSL de Capybara définit

attach_file('Image', '/path/to/image.jpg') 

Personnellement cela semble une meilleure façon de tester que d'interagir avec l'objet StringIO ... ne hésitez pas à rétorquer.

3

C'était un peu difficile à trouver pour Rails 3

Vous pouvez toujours utiliser la fonction fixture_file_upload, mais vous devez ajouter:

include ActionDispatch::TestProcess

Pour votre cas de test.

Cela ne fonctionnait pas du tout avec Rspec. Je devais simplement récupérer le fichier et publier le fichier directement.