tutorial rails imagenes active ruby-on-rails paperclip factory-bot

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



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'')) }