web-dev-qa-db-fra.com

tester un téléchargement de fichier en utilisant rspec - rails

Je souhaite tester un téléchargement de fichier dans Rails, mais je ne sais pas comment procéder.

Voici le code du contrôleur:

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 << chars[Rand(chars.size-1)] }

    #Get the original file name
    upload=params[:upload]
    name =  upload['datafile'].original_filename 

    @license.format = File.extname(name)

    #calculate license ID and location
    @license.location = './public/licenses/' + sessid + newpass + name 

    #Save the license file
    #Fileupload.save(params[:upload], @license.location) 
    File.open(@license.location, "wb") { |f| f.write(upload['datafile'].read) }

     #Set license ID
    @license.license_id = sessid + newpass

    #Save the license
    @license.save

    redirect_to :action => 'show', :id => @license.id 
end

J'ai essayé cette spécification, mais cela ne fonctionne pas:

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

Comment puis-je simuler le téléchargement de fichier à l'aide de rspec?

136
user727403

Vous pouvez utiliser la méthode fixture_file_upload pour tester le téléchargement de fichiers: Placez votre fichier de test dans "{Rails.root}/spec/fixtures/files" répertoire

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

Au cas où vous attendiez le fichier sous la forme de params ['upload'] ['datafile']

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

Je ne sais pas si vous pouvez tester le téléchargement de fichiers en utilisant uniquement RSpec. Avez-vous essayé Capybara ?

Il est facile de tester le téléchargement de fichiers à l'aide de attach_file méthode à partir d'une spécification de demande.

Par exemple (ce code est uniquement une démo):

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
53
Ken

si vous incluez Rack :: Test *, incluez simplement les méthodes de test

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

alors vous pouvez utiliser la méthode UploadedFile:

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

* NOTE: Mon exemple est basé sur Sinatra, qui étend Rack, mais devrait fonctionner avec Rails, qui utilise également Rack, TTBOMK.

32
zedd45

Je n’ai pas utilisé RSpec pour cela, mais j’ai un test Test :: Unit qui fait quelque chose de similaire pour le téléchargement d’une photo. J'ai configuré le fichier téléchargé en tant qu'instance de ActionDispatch :: Http :: UploadedFile, comme suit:

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

Quelque chose de semblable pourrait fonctionner pour vous aussi.

16
Dave Isaacs

J'ai dû ajouter ces deux éléments pour le faire fonctionner:

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