Han Chee
Han Chee

Reputation: 311

fixture_file_upload has {file} does not exist error

Below is my testing code for uploading file.

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

However, when I run rspec spec, it produced me the error below

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

I have googled alot of places but I still couldn't find out what's the reason behind it. Any idea?

Upvotes: 21

Views: 18106

Answers (3)

thisismydesign
thisismydesign

Reputation: 25054

This is how I did it with Rails 6, RSpec and Rack::Test::UploadedFile

describe 'POST /create' do
  it 'responds with success' do
    post :create, params: {
      company: {
        logo: Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/test-pic.png"),
        name: 'test'
      }
    }

    expect(response).to be_successful
  end
end

DO NOT include ActionDispatch::TestProcess or any other code unless you're sure about what you're including.

Upvotes: 7

Adrian Teh
Adrian Teh

Reputation: 1967

Fixture_file_upload basically still works. You just need to make sure the fixtures path in your spec_helper.rb file is uncommented & correctly set to the spec/fixtures path & to include 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"

  ...

And where you are specifying the file in your tests, be sure to precede your file name with '/' like the following example:

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

The absolute path to the file is the base path specified in config.fixture_path plus the relative path specified in fixture_file_upload function call. So, in this example, file.csv must be placed in #{::Rails.root}/spec/fixtures/files/data.csv

Upvotes: 31

hectorsq
hectorsq

Reputation: 76976

Based on the most voted answer on this question, you have to put the file under {Rails.root}/spec/fixtures/files

Upvotes: 1

Related Questions