2012-01-25 23 views
16

Di seguito è riportato il mio codice di test per il caricamento del file.fixture_file_upload ha {file} inesistente errore

describe "file process" do 
before(:each) do 
    # debugger 
    @file = fixture_file_upload('test.csv', 'text/csv') 
end 

it "should be able to upload file" do 
    post :upload_csv, :upload => @file 
    response.should be_success 
end 
end 

Tuttavia, quando si esegue RSpec spec, mi ha prodotto l'errore sotto

Failure/Error: @file = fixture_file_upload('test.csv', 'text/csv') 
RuntimeError: 
    test.csv file does not exist 
# ./spec/controllers/quotation_controller_spec.rb:29:in `block (3 levels) in <top (required)>' 

Googled un sacco di posti, ma ancora non riuscivo a scoprire che cosa è la ragione dietro di esso. Qualche idea?

+7

Trovato una soluzione da SO [http://stackoverflow.com/questions/3966263/attachment-fu-testing-in-rails-3](http:// stackoverflow.com/questions/3966263/attachment-fu-testing-in-rails-3). A quanto pare, devo sostituire fixture_file_upload con questa riga '@file = Rack :: Test :: UploadedFile.new (Rails.root.join ('spec/fixtures/test.csv'), 'text/csv')' – hanchee

+0

fixture_file_upload non funziona con Rails 3.1? – hanchee

+1

Ho iniziato a vederlo dopo l'aggiornamento a 3.2 – plainjimbo

risposta

0

Sulla base della risposta più votata this domanda, è necessario inserire il file in {} Rails.root/spec/fixtures/file

26

Fixture_file_upload fondamentalmente funziona ancora. Hai solo bisogno di assicurarsi che il percorso gli infissi nel file spec_helper.rb sia commentata & correttamente impostata sul spec/fixtures percorso & includere ActionDispath::TestProcess:

RSpec.configure do |config| 
    config.include ActionDispatch::TestProcess 

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    ... 

E dove si specifica il file nel vostro test, assicurarsi di far precedere il vostro nome file con '/' il seguente esempio:

describe "POST /subscriber_imports" do 
    let(:file) { { :file => fixture_file_upload('/files/data.csv', 'text/csv') } } 
    subject { post :create, :subscriber_import => file } 
    ... 
end 

il percorso assoluto al file è il percorso base specificata nel config.fixture_path più il relativo percorso specificato in fixture_file_upload chiamata di funzione. Quindi, in questo esempio, file.csv deve essere inserito in #{::Rails.root}/spec/fixtures/files/data.csv

+3

Nota anche l'opzione 'include ActionDispatch: : TestProcess'. Questo in particolare ha risolto il problema per me – FeifanZ

+0

'include ActionDispatch :: TestProcess' è quello che ha risolto anche per me. La parte dispari è che abbiamo usato 'fixture_file_upload' bene in altri test di rspec, ma non è riuscito a crearne uno nuovo. Potrebbe essere stato che questa nuova specifica è stata esaminata in un modulo. – nrowegt

Problemi correlati