rails mount_uploader imageuploader gema aws ruby-on-rails ruby-on-rails-3 unit-testing fixtures carrierwave

ruby on rails - mount_uploader - ¿Rails 3 accesorios de prueba con carrierwave?



show image carrierwave (5)

Estoy trabajando en la actualización de attachment_fu a carrierwave, ya que attachment_fu está roto en los rieles 3.

Ninguna de las pruebas se puede ejecutar, porque tenemos dispositivos no válidos que utilizaban la sintaxis de attachment_fu para los archivos adjuntos.

Por ejemplo, tenemos un modelo Post que tiene un PostAttachment. Así es como se ven los datos en el dispositivo de Fijación de mensajes:

a_image: post_id: 1 attachment_file: <%= Rails.root>/test/files/test.png

Y este es el error que estoy recibiendo:

ActiveRecord::StatementInvalid: PGError: ERROR: column "attachment_file" of relation "post_attachments" does not exist LINE 1: INSERT INTO "post_attachments" ("post_id", "attachment_file"...

attachment_file habría recogido el archivo attachment_fu, y se habría ocupado de todo el procesamiento para crear el archivo adjunto attachment_fu para el modelo.

¿Hay una manera de tener archivos adjuntos de imagen en los aparatos, pero con el uso de CarrierWave en su lugar?


Acabamos de eliminar todos los accesorios, el sistema siembra estos archivos para cada prueba. Pregúntate a ti mismo ... ¿Necesitas todos estos accesorios aquí para esta prueba? No, probablemente no. Y los accesorios no BANG! así que solo usamos Model.create!( ... ) con datos específicos para la prueba


Intenta pasar un archivo en lugar de una cadena.

a_image: post_id: 1 attachment_file: File.open(Rails.root.join("test/files/test.png"))

Esto funciona para mí usando FactoryGirl

Nota: Editar gracias a @dkobozev


La única forma en que he logrado que esto funcione es usar un proveedor de almacenamiento específicamente para las pruebas que no guardan / leen archivos.

En su config/initializers/carrier_wave.rb Agregue una clase NullStorage que implemente la interfaz mínima para un proveedor de almacenamiento.

# NullStorage provider for CarrierWave for use in tests. Doesn''t actually # upload or store files but allows test to pass as if files were stored and # the use of fixtures. class NullStorage attr_reader :uploader def initialize(uploader) @uploader = uploader end def identifier uploader.filename end def store!(_file) true end def retrieve!(_identifier) true end end

Luego, al inicializar CarrierWave, agregue una cláusula para el entorno de prueba, por ejemplo,

if Rails.env.test? config.storage NullStorage end

Aquí hay un resumen de mi completa carrier_wave.rb para referencia. También incluye cómo configurar S3 para cargas en almacenamiento / producción y almacenamiento local para el desarrollo para que pueda ver cómo configurar CarrierWave en contexto.

Una vez que CarrierWave esté configurado, simplemente puede colocar cualquier cadena en la columna de accesorios para simular un archivo cargado.


Para poder usar los aparatos que han subido archivos y realizar subidas en las pruebas, he jugado un poco con CarrierWave por un poco últimamente. He escrito un article sobre cómo lo haría.


config / initializers / carrier_wave.rb

En rieles 4

# class NullStorage is defined here before the following block if Rails.env.test? CarrierWave.configure do |config| config.storage NullStorage end end

y en accesorios:

a_image: post_id: 1 attachment_file: <%= File.open(Rails.root.join("test/files/test.png")) %>