18

estoy trabajando en la actualización de attachment_fu a carrierwave, ya attachment_fu está roto en los carriles 3.Rails 3 accesorios de prueba con carrierwave?

Ninguna de las pruebas son capaces de correr, porque tenemos accesorios no válidos que estaban usando la sintaxis de attachment_fu para archivos adjuntos.

Por ejemplo, tenemos un modelo de publicación que tiene una PostAttachment. Esto es lo que los datos en el dispositivo de conexión posterior se ve así:

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

Y este es el error que estoy consiguiendo:

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 sido recogido por attachment_fu, y habría tenido cuidado de todo el procesamiento para crear el archivo adjunto attachment_fu para el modelo.

¿Hay alguna manera de tener archivos adjuntos de imagen en los dispositivos, pero con el uso de CarrierWave?

Respuesta

8

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

+3

'File.open (Rails.root + "/test/files/test.png")' no funciona para yo. 'File.open (Rails.root.join (" test/files/test.png "))' hace. – dkobozev

+0

Lo cambié ... Muchas gracias. – e3matheus

+1

En las versiones actuales de carrierwave esto no funciona para mí. He intentado citar/escapar/ERB la llamada 'File.open ...' anterior. También he intentado usar 'Rack :: Test :: UploadedFile.new (Rails.root.join (" test/files/test.png "))', que funciona cuando se pasa como parámetro. – Leo

19

La única manera que he logrado conseguir que esto funcione es utilizar un proveedor de almacenamiento específicamente para prueba que en realidad no guarda/lee 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, cuando la inicialización de CarrierWave añadir una cláusula para el entorno de prueba, por ejemplo,

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

Aquí es una gist of my complete carrier_wave.rb para referencia. También incluye cómo configurar S3 para cargas en etapas/producción y almacenamiento local para desarrollo para que pueda ver cómo configurar CarrierWave en contexto.

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

+0

Cuando probé con un archivo arg en la fábrica, recibí un error 'ArgumentError: no es un proveedor de almacenamiento reconocido'. La conversión a una cadena, como usted sugiere, ¡lo hace funcionar! ¡Hurra! ¡Gracias! – brookr

+2

Bueno, tenía esperanzas, pero ... Esto todavía se muestra como 'no es un proveedor de almacenamiento reconocido' cuando visito una página con un campo de formulario en mis características. ¿Hay alguna forma de registrar NullStorage como proveedor reconocido? – brookr

+0

No estoy completamente seguro de lo que hace NullStorage; pero tengo pruebas unitarias que hacen cosas como enviar por correo electrónico archivos adjuntos de archivos cargados previamente, ¿cómo se pueden probar? Probé los pasos anteriores y no parecen ayudar. Gracias. – Gerry

1

Para poder utilizar dispositivos que han cargado archivos y también cargas en las pruebas, he jugado un poco con CarrierWave recientemente. He escrito un article sobre cómo lo haría.

+0

El archivo no se guarda de forma permanente, pero la prueba tampoco me pasa. – Zhang

-4

Acabamos de eliminar todos los accesorios, el sistema genera estos archivos para cada prueba. Pregúntese ... ¿necesita todos estos accesorios aquí para esta prueba? No, probablemente no. ¡Y los accesorios no BANG! entonces solo usamos Model.create!(...) con datos específicos para la prueba

2

config/initializers/carrier_wave.rb

En los carriles 4

# class NullStorage is defined here before the following block 

if Rails.env.test? 
    CarrierWave.configure do |config| 
    config.storage NullStorage 
    end 
end 

& en accesorios:

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