Chcę przetestować przesyłanie plików na railsach, ale nie jestem pewien, jak to zrobić.
Oto kod kontrolera:
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
Wypróbowałem tę specyfikację, ale nie działa:
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
Jak mogę zasymulować przesyłanie pliku przy użyciu rspec?
ruby-on-rails
file-upload
tdd
rspec-rails
user727403
źródło
źródło
post
była metoda pomocnika ścieżki, której jedyny zamierzony argument nie został ujęty w nawiasy, więc następujące tokeny zostały zinterpretowane jako dodatkowe argumenty pomocnika, a nie argumenty dla samego postu. Np.post order_documents_path @order, document: file
Zamiastpost order_documents_path(@order), document: file
.Nie jestem pewien, czy możesz przetestować przesyłanie plików przy użyciu samego RSpec. Czy próbowałeś Kapibary ?
Testowanie przesyłania plików metodą kapibary jest łatwe
attach_file
ze specyfikacji żądania.Na przykład (ten kod jest tylko demo):
źródło
jeśli włączysz Rack :: Test *, po prostu dołącz metody testowe
wtedy możesz użyć metody UploadedFile:
* UWAGA: Mój przykład jest oparty na Sinatrze, który rozszerza Rack, ale powinien działać z Railsami, które również używają Rack, TTBOMK
źródło
include Rack::Test::Methods
używać Rack :: Test :: UploadedFile.require 'rack/test
wystarczy.require 'rack/test'
. jeśli używasz,Rack::Test::UploadedFile
to jest wystarczająco dobre, aby go używać. Pod warunkiem, że konfiguracja aplikacji Rails jest w porządku. PS: Jestem włączonyRails 4
iruby 2.1
rack/test
będzie obejmować wszystko od testu, który obejmujetest/methods
, ale także obejmuje wszystko w teście, więc prawdopodobnie więcej niż potrzebujesz.Nie zrobiłem tego przy użyciu RSpec, ale mam test Test :: Unit, który robi coś podobnego do przesyłania zdjęcia. Skonfigurowałem przesłany plik jako wystąpienie ActionDispatch :: Http :: UploadedFile w następujący sposób:
Coś podobnego może działać również dla Ciebie.
źródło
To jak to zrobiłem z
Rails 6
,RSpec
iRack::Test::UploadedFile
NIE WŁĄCZAJ
ActionDispatch::TestProcess
ani żadnego innego kodu, chyba że masz pewność, co zawiera.źródło
Musiałem dodać oba te elementy, aby działało:
źródło