Je veux tester un téléchargement de fichier dans des 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 du fichier à l'aide de rspec?
ruby-on-rails
file-upload
tdd
rspec-rails
user727403
la source
la source
post
était une méthode d'assistance de chemin, dont le seul argument voulu que je n'ai pas mis entre parenthèses, de sorte que les jetons suivants ont été interprétés comme des arguments supplémentaires pour l'aide, plutôt que comme des arguments pour le message lui-même. Par exemple, j'ai eupost order_documents_path @order, document: file
au lieu depost order_documents_path(@order), document: file
.Je ne sais pas si vous pouvez tester les téléchargements de fichiers en utilisant uniquement RSpec. Avez-vous essayé Capybara ?
Il est facile de tester les téléchargements de fichiers à l'aide de la
attach_file
méthode capybara à partir d'une spécification de demande.Par exemple (ce code est une démo uniquement):
la source
si vous incluez Rack :: Test *, incluez simplement les méthodes de test
alors vous pouvez utiliser la méthode UploadedFile:
* REMARQUE: Mon exemple est basé sur Sinatra, qui étend Rack, mais devrait fonctionner avec Rails, qui utilise également Rack, TTBOMK
la source
include Rack::Test::Methods
utiliser Rack :: Test :: UploadedFile.require 'rack/test
est assez.require 'rack/test'
. si vous utilisez,Rack::Test::UploadedFile
c'est assez bon pour l'utiliser. À condition que la configuration de votre application de rails soit correcte. PS: Je suis surRails 4
etruby 2.1
rack/test
inclura tout du test, qui comprendtest/methods
, mais comprend également tout ce qui est en test, donc probablement plus que ce dont vous avez besoin.Je n'ai pas fait cela en utilisant RSpec, mais j'ai un test Test :: Unit qui fait quelque chose de similaire pour télécharger une photo. J'ai configuré le fichier téléchargé en tant qu'instance d'ActionDispatch :: Http :: UploadedFile, comme suit:
Quelque chose de similaire pourrait également fonctionner pour vous.
la source
C'est comme ça que je l'ai fait avec
Rails 6
,RSpec
etRack::Test::UploadedFile
N'incluez PAS
ActionDispatch::TestProcess
ni aucun autre code, sauf si vous êtes sûr de ce que vous incluez .la source
J'ai dû ajouter ces deux inclus pour le faire fonctionner:
la source