Saya ingin menguji unggahan file di rails, tetapi saya tidak yakin bagaimana melakukan ini.
Berikut adalah kode pengontrol:
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
Saya telah mencoba spesifikasi ini, tetapi tidak berhasil:
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
Bagaimana saya bisa mensimulasikan unggahan file, menggunakan rspec?
ruby-on-rails
file-upload
tdd
rspec-rails
pengguna727403
sumber
sumber
post
adalah metode path helper, yang satu-satunya argumen yang saya maksud tidak dimasukkan dalam tanda kurung, jadi token berikut ditafsirkan sebagai argumen tambahan untuk helper, bukan argumen untuk posting itu sendiri. Misalnya, sayapost order_documents_path @order, document: file
malah gantipost order_documents_path(@order), document: file
.Saya tidak yakin apakah Anda dapat menguji unggahan file menggunakan RSpec saja. Sudahkah Anda mencoba Capybara ?
Sangat mudah untuk menguji unggahan file menggunakan
attach_file
metode capybara dari spec permintaan.Misalnya (kode ini hanya demo):
sumber
jika Anda memasukkan Rack :: Test *, cukup sertakan metode pengujian
maka Anda dapat menggunakan metode UploadedFile:
* CATATAN: Contoh saya didasarkan pada Sinatra, yang memanjang Rack, tetapi harus bekerja dengan Rails, yang juga menggunakan Rack, TTBOMK
sumber
include Rack::Test::Methods
menggunakan Rack :: Test :: UploadedFile.require 'rack/test
cukup.require 'rack/test'
. jika Anda menggunakanRack::Test::UploadedFile
itu cukup baik untuk menggunakannya. Asalkan pengaturan aplikasi rel Anda baik-baik saja. PS: Saya aktifRails 4
danruby 2.1
rack/test
akan mencakup segala sesuatu dari tes, yang termasuktest/methods
, tetapi juga mencakup semua yang diuji, jadi mungkin lebih dari yang Anda butuhkan.Saya belum melakukan ini menggunakan RSpec, tetapi saya memiliki Test :: Unit test yang melakukan sesuatu yang serupa untuk mengunggah foto. Saya mengatur file yang diunggah sebagai instance dari ActionDispatch :: Http :: UploadedFile, sebagai berikut:
Hal serupa mungkin juga berlaku untuk Anda.
sumber
Beginilah cara saya melakukannya
Rails 6
,RSpec
danRack::Test::UploadedFile
JANGAN sertakan
ActionDispatch::TestProcess
atau kode lain apa pun kecuali Anda yakin tentang apa yang Anda sertakan .sumber
Saya harus menambahkan keduanya termasuk untuk membuatnya berfungsi:
sumber