J'ai le modèle Person qui a beaucoup d'images, où les images ont un champ de pièce jointe de trombone appelé data, une version abrégée affichée ci-dessous:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
La personne doit avoir au moins une image attachée.
Lorsque j'utilise FactoryGirl, j'ai un code semblable à ce qui suit:
Factory.define :image do |a|
a.data { File.new(File.join(Rails.root, 'features', 'support', 'file.png')) }
a.association :person
end
Factory.define :person do |p|
p.first_name 'Keyzer'
p.last_name 'Soze'
p.after_create do |person|
person.assets = [Factory.build(:image, :person => person)]
end
# p.images {|images| [images.association(:image)]}
end
(NB J'ai également essayé le code commenté ci-dessus a également été essayé) La plupart du temps, lorsque j'exécute des fonctionnalités de concombre, j'obtiens une erreur semblable à celle-ci:
Aucun fichier ou répertoire de ce type - /tmp/stream,9887,0.png (Errno :: ENOENT)
...
Parfois, les tests fonctionnent avec succès.
Quelqu'un peut-il me dire quel est le problème que j'ai ici ou comment ils utilisent FactoryGirl et Paperclip ensemble pour réaliser quelque chose comme ce que j'essaie de réaliser?
J'utilise Rails 3.
Réponses:
Vous pouvez utiliser fixture_file_upload
include ActionDispatch::TestProcess
dans votre assistant de test, voici un exemple d'usine:Dans l'exemple ci-dessus,
spec/photos/test.png
doit exister dans le répertoire racine de votre application avant d'exécuter vos tests.Notez qu'il
FactoryBot
s'agit d'un nouveau nom pourFactoryGirl
.la source
{ }
sont obligatoires. Ça casse sans çainclude ActionDispatch::TestProcess
doit être inséré tout en haut du fichier d'usine, à l' extérieur duFactoryGirl.define do...end
bloc.Nouvelle syntaxe FG et aucune inclusion nécessaire
ou, mieux encore,
la source
Desmond Bowe de Pivotal Labs suggère d'éviter fixture_file_upload en raison de problèmes de fuite de mémoire. Au lieu de cela, vous devez définir les champs du trombone directement dans votre usine:
la source
content_type
. Pour cela, vous avez besoin d'un objet fichier valide.J'ai utilisé le code dans l'essentiel ci-dessous:
Rails 2
http://gist.github.com/162881
Rails 3
https://gist.github.com/313121
la source
la source
Essayez d'utiliser ActionController :: TestUploadedFile. Vous pouvez simplement définir la propriété file sur une instance de TestUploadedFile et paperclip devrait s'occuper du reste. Par exemple
la source
Les réponses ci-dessus dans certains cas peuvent aider, et celle-ci m'a aidé dans l'une de mes situations, mais lors de l'utilisation d'un Carrierwave, la solution précédente de cette question n'a pas fonctionné cette fois.
PREMIÈRE APPROCHE:
Pour moi, l'ajout d'un a
after :create
résolu le problème pour moi comme ceci:La configuration du fichier vidéo en ligne
video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
n'a pas fonctionné et a signalé des erreurs.DEUXIÈME APPROCHE:
Définissez une usine comme celle-ci (changez
personal_file
le nom de votre pièce jointe):Et ajoutez ces lignes au
config/environemnts/test.rb
:la source
Que testez-vous exactement? Ce trombone réussira à joindre le fichier? Cela semble vraiment être un test que le trombone devrait gérer, pas votre application.
As-tu essayé
Nous utilisons Machinist au lieu de factory_girl et nous venons d'utiliser des choses comme
Cependant, nous ne testons pas vraiment beaucoup lorsque nous faisons cela, nous voulons généralement juste avoir un
Image
objet valide .la source