Tengo una persona modelo que tiene muchas imágenes, donde las imágenes tienen un campo adjunto de clip de papel llamado datos, una versión abreviada que se muestra a continuación:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Se requiere que la persona tenga al menos una imagen adjunta.
Cuando uso FactoryGirl, tengo un código similar al siguiente:
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
(Nota: también probé el código comentado anteriormente) La mayoría de las veces cuando ejecuto funciones de pepino, aparece un error similar al siguiente:
No existe tal archivo o directorio - /tmp/stream,9887,0.png (Errno :: ENOENT)
...
A veces, las pruebas se ejecutan con éxito.
¿Alguien puede decirme cuál es el problema que tengo aquí o cómo usan FactoryGirl y Paperclip juntos para lograr algo como lo que estoy tratando de lograr?
Estoy usando Rails 3.
Respuestas:
Puede usar fixture_file_upload
include ActionDispatch::TestProcess
en su ayudante de prueba, aquí hay una fábrica de ejemplo:En el ejemplo anterior,
spec/photos/test.png
debe existir en el directorio raíz de su aplicación antes de ejecutar sus pruebas.Tenga en cuenta que
FactoryBot
es un nombre nuevo paraFactoryGirl
.fuente
{ }
son obligatorios. Se rompe sin élinclude ActionDispatch::TestProcess
debe insertarse en la parte superior del archivo de fábrica, fuera delFactoryGirl.define do...end
bloque.Nueva sintaxis de FG y no es necesario incluir
o mejor aún,
fuente
Desmond Bowe de Pivotal Labs sugiere evitar fixture_file_upload debido a problemas de pérdida de memoria. En su lugar, debe configurar los campos del clip directamente en su fábrica:
fuente
content_type
. Para eso necesita un objeto de archivo válido.He estado usando el código en la esencia a continuación:
Carriles 2
http://gist.github.com/162881
Carriles 3
https://gist.github.com/313121
fuente
fuente
Intente usar ActionController :: TestUploadedFile. Puede simplemente establecer la propiedad del archivo en una instancia de TestUploadedFile y el clip debe encargarse del resto. Por ejemplo
fuente
Las respuestas anteriores en algunos casos pueden ayudar, y la que realmente ayudó en una de mis situaciones, pero al usar un Carrierwave, la solución anterior de esta pregunta no funcionó esta vez.
PRIMER ENFOQUE:
Para mí, agregando un
after :create
problema resuelto para mí de esta manera:La configuración del archivo de video en línea como
video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
no funcionó y estaba informando errores.SEGUNDO ENFOQUE:
Defina una fábrica como esta (cambie
personal_file
a su nombre de archivo adjunto):Y agregue estas líneas al
config/environemnts/test.rb
:fuente
¿Qué estás probando exactamente? ¿Ese clip adjuntará correctamente el archivo? Eso realmente parece una prueba que debe manejar el clip, no su aplicación.
Has probado
Usamos Machinist en lugar de factory_girl y acabamos de usar cosas como
Sin embargo, en realidad no estamos probando mucho cuando hacemos esto, normalmente solo queremos tener un
Image
objeto válido .fuente