ruby-on-rails - imagenes - storage rails
¿Cómo utilizo Factory Girl para generar un archivo adjunto de Paperclip? (8)
¿Qué estás probando exactamente? Ese clip de papel se adjuntará con éxito el archivo? Eso realmente parece una prueba que debe manejar el clip, no su aplicación.
Has probado
a.data { File.join(Rails.root, ''features'', ''support'', ''file.png'') }
Usamos Machinist en lugar de factory_girl y acabamos de usar cosas como
Image.blueprint do
image { RAILS_ROOT + ''spec/fixtures/images/001.jpg'' }
end
Sin embargo, en realidad no estamos probando mucho cuando hacemos esto, normalmente solo queremos tener un objeto Image
válido.
Tengo una persona modelo que tiene muchas imágenes, donde las imágenes tienen un campo adjunto de Paperclip 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
(NB También he intentado que el código comentado anteriormente también se haya intentado) La mayoría de las veces cuando ejecuto características de pepino, obtengo un error similar al siguiente:
No hay 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 estoy teniendo aquí o cómo usan FactoryGirl y Paperclip juntos para lograr algo así como lo que estoy tratando de lograr?
Estoy usando Rails 3.
Desmond Bowe en Pivotal Labs sugiere evitar fixture_file_upload debido a problemas de pérdida de memoria. En su lugar, debe establecer los campos de clip directamente en su fábrica:
factory :attachment do
supporting_documentation_file_name { ''test.pdf'' }
supporting_documentation_content_type { ''application/pdf'' }
supporting_documentation_file_size { 1024 }
# ...
end
He estado usando el código en la esencia a continuación:
Carriles 2
Carriles 3
Intenta usar ActionController :: TestUploadedFile. Puede establecer la propiedad del archivo en una instancia de TestUploadedFile y paperclip debe encargarse del resto. Por ejemplo
valid_file = File.new(File.join(Rails.root, ''features'', ''support'', ''file.png''))
p.images {
[
ActionController::TestUploadedFile.new(valid_file, Mime::Type.new(''application/png''))
]
}
Las respuestas anteriores en algunos casos pueden ayudar, y la que en realidad ayudó en una de mis situaciones, pero al usar una onda Carrierwave, la solución anterior de esta pregunta no funcionó esta vez.
PRIMER ENFOQUE:
Para mí, agregar un after :create
solucionó el problema de la siguiente manera:
after :create do |b|
b.update_column(:video_file, File.join(Rails.root, ''spec'', ''fixtures'', ''sample.mp4''))
end
Establecer el archivo de video en línea como archivo de video video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
no funcionó y estaba informando de errores.
SEGUNDO ENFOQUE:
Defina una fábrica como esta (cambie el archivo personal_file
a su nombre de archivo adjunto):
FactoryGirl.define do
factory :contact do
personal_file { File.new("#{Rails.root}/spec/fixtures/personal_files/my_test_file.csv") }
personal_file_content_type ''text/csv''
end
end
Y agregue estas líneas a config/environemnts/test.rb
:
config.paperclip_defaults = {
url: "#{Rails.root}/spec/fixtures/:attachment/:filename",
use_timestamp: false
}
Puedes usar fixture_file_upload
include ActionDispatch::TestProcess
en su asistente de prueba, aquí hay una fábrica de ejemplo:
factory :user do
avatar { fixture_file_upload(Rails.root.join(''spec'', ''photos'', ''test.png''), ''image/png'') }
end
En el ejemplo anterior, spec/photos/test.png
necesita existir en el directorio raíz de su aplicación antes de ejecutar sus pruebas.
Sintaxis FG más nueva y no incluye necesaria
factory :user do
avatar { File.new(Rails.root.join(''app'', ''assets'', ''images'', ''rails.png'')) }
end
o mejor aún,
factory :user do
avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") }
end
file { File.new(Rails.root.join(''spec'', ''fixtures'', ''filename.png'')) }