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?
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
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
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.
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.
J'ai dû ajouter ces deux éléments pour le faire fonctionner:
describe "my test set" do
include Rack::Test::Methods
include ActionDispatch::TestProcess