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")) %>