Ich möchte einen Datei-Upload in Rails testen, bin mir aber nicht sicher, wie ich das machen soll.
Hier ist der 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 << 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
Ich habe diese Spezifikation ausprobiert, aber sie funktioniert nicht:
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
Wie kann ich den Datei-Upload mit rspec simulieren?
ruby-on-rails
file-upload
tdd
rspec-rails
user727403
quelle
quelle
post
eine Pfadhilfemethode, deren einziges beabsichtigtes Argument ich nicht in Klammern gesetzt habe. Daher wurden die folgenden Token als zusätzliche Argumente für den Helfer und nicht als Argumente für den Beitrag selbst interpretiert. ZB hatte ichpost order_documents_path @order, document: file
stattpost order_documents_path(@order), document: file
.Ich bin nicht sicher, ob Sie Datei-Uploads nur mit RSpec testen können. Haben Sie Capybara ausprobiert ?
Es ist einfach, Datei-Uploads mit der
attach_file
Methode von capybara aus einer Anforderungsspezifikation zu testen .Zum Beispiel (dieser Code ist nur eine Demo):
quelle
Wenn Sie Rack :: Test * einschließen, geben Sie einfach die Testmethoden an
Dann können Sie die UploadedFile-Methode verwenden:
* HINWEIS: Mein Beispiel basiert auf Sinatra, das Rack erweitert, aber mit Rails funktionieren sollte, das auch Rack, TTBOMK verwendet
quelle
include Rack::Test::Methods
Rack :: Test :: UploadedFile verwenden.require 'rack/test
reicht.require 'rack/test'
. Wenn Sie verwendenRack::Test::UploadedFile
, ist das gut genug, um es zu verwenden. Vorausgesetzt, das Setup Ihrer Rails-App ist in Ordnung. PS: Ich bin aufRails 4
undruby 2.1
rack/test
umfasst alles aus dem Test, einschließlichtest/methods
, aber auch alles im Test, also wahrscheinlich mehr als Sie benötigen.Ich habe dies nicht mit RSpec gemacht, aber ich habe einen Test :: Unit-Test, der etwas Ähnliches zum Hochladen eines Fotos macht. Ich habe die hochgeladene Datei wie folgt als Instanz von ActionDispatch :: Http :: UploadedFile eingerichtet:
Ähnliches könnte auch für Sie funktionieren.
quelle
So habe ich es gemacht
Rails 6
,RSpec
undRack::Test::UploadedFile
Fügen Sie KEINEN
ActionDispatch::TestProcess
oder anderen Code hinzu, es sei denn, Sie sind sich sicher, was Sie einschließen.quelle
Ich musste beide Includes hinzufügen, damit es funktioniert:
quelle