18

Sto lavorando su aggiornamento da attachment_fu a carrierwave, dal momento che attachment_fu è rotto in rotaie 3.Rails 3 dispositivi di prova con carrierwave?

Nessuno dei test sono in grado di correre, perché abbiamo infissi non valide che stavano usando la sintassi da attachment_fu per i file allegati.

Ad esempio, disponiamo di un modello Post con un PostAttachment. Ecco quello che i dati contenuti nel dispositivo PostAttachment assomiglia:

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

E questo è l'errore che sto ricevendo:

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 sarebbe stato raccolto da attachment_fu, e sarebbe preso cura di tutta l'elaborazione per creare l'allegato attachment_fu per il modello.

C'è un modo per avere allegati di immagini nei dispositivi, ma con l'utilizzo di CarrierWave, invece?

risposta

8

Provare a passare un file anziché una stringa.

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

Questo funziona per me usando FactoryGirl

Nota: Modifica grazie alla @dkobozev

+3

File.open (Rails.root + "/test/files/test.png") '' non funziona per me. 'File.open (Rails.root.join (" test/files/test.png "))" fa. – dkobozev

+0

L'ho cambiato .. Grazie mille. – e3matheus

+1

Sulle versioni correnti di carrierwave questo non funziona per me. Ho provato citando/escaping/ERBing la chiamata 'File.open ...'. Ho anche provato a usare 'Rack :: Test :: UploadedFile.new (Rails.root.join (" test/files/test.png "))', che funziona quando viene passato come parametro. – Leo

19

L'unico modo sono riuscito a ottenere questo lavoro è quello di utilizzare un provider di archiviazione specifico per test che in realtà non salva/legge i file.

Nel config/initializers/carrier_wave.rb Aggiungere una classe NullStorage che implementa l'interfaccia minima per un provider di archiviazione.

# 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 

Poi nell'inizializzazione CarrierWave aggiungere una clausola per l'ambiente di prova, ad esempio,

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

Ecco un gist of my complete carrier_wave.rb per riferimento. Include anche come configurare S3 per i caricamenti in staging/produzione e storage locale per lo sviluppo in modo da poter vedere come configurare CarrierWave nel contesto.

Una volta configurato CarrierWave, è possibile semplicemente inserire qualsiasi stringa nella colonna fixture per simulare un file caricato.

+0

Quando ho provato con un file arg in fabbrica, ho ottenuto un errore 'ArgumentError: non riconosciuto da un fornitore di storage'. La conversione in una stringa, come suggerisci, lo fa funzionare! Sìì! Grazie! – brookr

+2

Bene, ero fiducioso, ma ... Questo è ancora visualizzato come "non un fornitore di storage riconosciuto" quando visito una pagina con un campo modulo nelle mie specifiche di funzionalità. C'è un modo per registrare NullStorage come fornitore riconosciuto? – brookr

+0

Non sono completamente sicuro di cosa faccia NullStorage; ma ho dei test unitari che fanno cose come l'invio di allegati di file precedentemente caricati - come si fa a testarli? Ho provato i passaggi precedenti e non sembrano aiutare. Grazie. – Gerry

1

Per essere in grado di utilizzare dispositivi che hanno caricato file oltre a fare upload nei test, ho giocato un po 'con CarrierWave ultimamente. Ho scritto un article su come lo farei.

+0

Il file non viene salvato in modo permanente ma il test non passa neanche per me. – Zhang

-4

Abbiamo appena rimosso tutti i dispositivi insieme, il sistema ha seminato questi file per ogni test. Chiediti ... hai bisogno di tutti questi proiettori qui per questo test? No probabilmente no. E Fixtures non BANG! quindi utilizziamo solo Model.create!(...) con dati specifici per il test

2

config/initializers/carrier_wave.rb

In Rails 4

# class NullStorage is defined here before the following block 

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

& in apparecchi:

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