119 votes

Comment Puis-Je Utiliser Factory Girl Pour Générer Un Trombone Pièce Jointe?

J'ai le modèle de Personne qui a beaucoup d'Images, où les images ont un Trombone attachement champ appelé de données, une version abrégée affiché ci-dessous:

class Person
  has_many :images
  ...
end

class Image
  has_attached_file :data
  belongs_to :person
  ...
end

Personne est nécessaire d'avoir au moins une Image attachée à elle.

Lors de l'utilisation de FactoryGirl, j'ai un code semblable au suivant:

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

(N. B. j'ai aussi essayé le code commenté ci-dessus a été aussi essayé) La plupart du temps, quand je lance dispositifs de concombre, j'obtiens un message d'erreur semblable au suivant:

Aucun fichier ou d'un répertoire /tmp/stream,9887,0.png (Errno::ENOENT)

...

Parfois, les tests s'exécutent correctement.

Quelqu'un peut-il me dire quel est le problème c'est que je vais avoir ici ou la façon dont ils utilisent FactoryGirl et un Trombone, ensemble pour atteindre quelque chose comme ce que je suis en train de réaliser?

Je suis à l'aide de Rails 3.

88voto

DanS Points 4992

Vous pouvez utiliser fixture_file_upload

include ActionDispatch::TestProcess dans votre test helper, voici un exemple de l'usine:

factory :user do
  avatar { fixture_file_upload(Rails.root.join('spec', 'photos', 'test.png'), 'image/png') }
end

Dans l'exemple ci-dessus, spec/photos/test.png des besoins existent dans votre répertoire racine des applications avant d'exécuter vos tests.

49voto

Neal Points 1594

Nouveaux FG syntaxe et n'inclut nécessaire

factory :user do
  avatar { File.new(Rails.root.join('app', 'assets', 'images', 'rails.png')) }
end

ou, mieux encore,

factory :user do
  avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } 
end

38voto

Rick Quantz Points 236

Desmond Bowe plus à 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 le trombone champs directement dans votre usine:

factory :attachment do
  supporting_documentation_file_name { 'test.pdf' }
  supporting_documentation_content_type { 'application/pdf' }
  supporting_documentation_file_size { 1024 }
  # ...
end

25voto

deb Points 2952

J'ai été en utilisant le code dans le résumé ci-dessous:

Rails 2

http://gist.github.com/162881

Rails 3

https://gist.github.com/313121

12voto

Matthew Deiters Points 101

fichier { Fichier.nouvelles(les Rails.de la racine.join('spec', 'montages', 'nom de fichier.png')) }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X