test a file upload using rspec - rails

匿名 (未验证) 提交于 2019-12-03 02:06:01

问题:

I want to test a file upload in rails, but am not sure how to do this.

Here is the controller code:

def uploadLicense     #Create the license object     @license = License.create(params[:license])        #Get Session ID     sessid = session[:session_id]      puts "\n\nSession_id:\n#{sessid}\n"      #Generate a random string     chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a     newpass = ""     1.upto(5) { |i| newpass  'show', :id => @license.id  end 

I have tried this spec, but it doesnt work:

it "can upload a license and download a license" do     file = File.new(Rails.root + 'app/controllers/lic.xml')     license = HashWithIndifferentAccess.new     license[:datafile] = file     info = {:id => 4}     post :uploadLicense, {:license => info, :upload => license} end 

How can I simulate the file upload, using rspec?

回答1:

You can use fixture_file_upload method to test file uploading: Put your test file in "{Rails.root}/spec/fixtures/files" directory

before :each do   @file = fixture_file_upload('files/test_lic.xml', 'text/xml') end  it "can upload a license" do   post :uploadLicense, :upload => @file   response.should be_success end 

In case you were expecting the file in the form of params['upload']['datafile']

it "can upload a license" do   file = Hash.new   file['datafile'] = @file   post :uploadLicense, :upload => file   response.should be_success end 


回答2:

I am not sure if you can test file uploads using RSpec alone. Have you tried Capybara?

It's easy to test file uploads using capybara's attach_file method from a request spec.

For example (this code is a demo only):

it "can upload a license" do   visit upload_license_path   attach_file "uploadLicense", /path/to/file/to/upload   click_button "Upload License" end  it "can download an uploaded license" do   visit license_path   click_link "Download Uploaded License"   page.should have_content("Uploaded License") end 


回答3:

if you include Rack::Test*, simply include the test methods

describe "my test set" do   include Rack::Test::Methods 

then you can use the UploadedFile method:

post "/upload/", "file" => Rack::Test::UploadedFile.new("path/to/file.ext", "mime/type") 

*NOTE: My example is based on Sinatra, which extends Rack, but should work with Rails, which also uses Rack, TTBOMK



回答4:

I haven't done this using RSpec, but I do have a Test::Unit test that does something similar for uploading a photo. I set up the uploaded file as an instance of ActionDispatch::Http::UploadedFile, as follows:

test "should create photo" do   setup_file_upload   assert_difference('Photo.count') do     post :create, :photo => @photo.attributes   end   assert_redirected_to photo_path(assigns(:photo)) end   def setup_file_upload   test_photo = ActionDispatch::Http::UploadedFile.new({     :filename => 'test_photo_1.jpg',     :type => 'image/jpeg',     :tempfile => File.new("#{Rails.root}/test/fixtures/files/test_photo_1.jpg")   })   @photo = Photo.new(     :title => 'Uploaded photo',      :description => 'Uploaded photo description',      :filename => test_photo,      :public => true) end 

Something similar might work for you also.



回答5:

I had to add both of these includes to get it working:

describe "my test set" do   include Rack::Test::Methods   include ActionDispatch::TestProcess 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!