Below is my testing code for uploading file.
describe \"file process\" do
before(:each) do
# debugger
@file = fixture_file_upload(\'test.csv\', \'text/csv
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.
Based on the most voted answer on this question, you have to put the file under {Rails.root}/spec/fixtures/files
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