2012-01-25 16 views
16

A continuación se muestra mi código de prueba para cargar el archivo.fixture_file_upload has {file} no existe error

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 

Sin embargo, cuando corro rspec especificación, me produjo el error abajo

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)>' 

He buscado en Google un montón de lugares, pero todavía no podía averiguar cuál es la razón detrás de ella. ¿Alguna idea?

+7

Encontrado una solución de SO [http://stackoverflow.com/questions/3966263/attachment-fu-testing-in-rails-3](http:// stackoverflow.com/questions/3966263/attachment-fu-testing-in-rails-3). Aparentemente, tengo que reemplazar el fixture_file_upload con esta línea '@file = Rack :: Test :: UploadedFile.new (Rails.root.join ('spec/fixtures/test.csv'), 'text/csv')' – hanchee

+0

fixture_file_upload no funciona con Rails 3.1? – hanchee

+1

Empecé a ver esto después de actualizar a 3.2 – plainjimbo

Respuesta

0

Sobre la base de la respuesta más votada this pregunta, usted tiene que poner el archivo en {} Rails.root/spec/fixtures/archivos

26

Fixture_file_upload básicamente todavía funciona. Sólo tiene que asegurarse de ruta los accesorios en su archivo spec_helper.rb descomentada & ajustado correctamente a la ruta & spec/fixtures incluir 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" 

    ... 

Y dónde está especificando el archivo en sus pruebas, asegúrese de preceder a su nombre de archivo con '/' como el siguiente ejemplo:

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

la ruta absoluta al archivo es la ruta de la base especificada en config.fixture_path más la ruta relativa especificada en fixture_file_upload llamada de función. Por lo tanto, en este ejemplo, file.csv se debe colocar en #{::Rails.root}/spec/fixtures/files/data.csv

+3

También tenga en cuenta que 'include ActionDispatch: : TestProcess'. Esto en particular solucionó el problema para mí – FeifanZ

+0

'include ActionDispatch :: TestProcess' es lo que también lo solucionó. Lo extraño es que habíamos usado 'fixture_file_upload' fine en otras pruebas de rspec, pero falló en una nueva. Puede haber sido que esta nueva especificación se definió en un módulo. – nrowegt

Cuestiones relacionadas