Quiero probar la carga de un archivo en rieles, pero no estoy seguro de cómo hacerlo.
Aquí está el código del controlador:
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
He intentado esta especificación, pero no funciona:
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
¿Cómo puedo simular la carga del archivo usando rspec?
ruby-on-rails
file-upload
tdd
rspec-rails
usuario727403
fuente
fuente
post
fue un método de ayuda de ruta, cuyo único argumento intencionado no incluí entre paréntesis, por lo que los siguientes tokens se interpretaron como argumentos adicionales para el asistente, en lugar de argumentos para la publicación en sí. Por ejemplo, tuve enpost order_documents_path @order, document: file
lugar depost order_documents_path(@order), document: file
.No estoy seguro de si puede probar la carga de archivos utilizando solo RSpec. ¿Has probado Carpincho ?
Es fácil probar las cargas de archivos utilizando el
attach_file
método de capibara a partir de una especificación de solicitud.Por ejemplo (este código es solo una demostración):
fuente
si incluye Rack :: Test *, simplemente incluya los métodos de prueba
entonces puedes usar el método UploadedFile:
* NOTA: Mi ejemplo se basa en Sinatra, que extiende Rack, pero debería funcionar con Rails, que también usa Rack, TTBOMK
fuente
include Rack::Test::Methods
que usar Rack :: Test :: UploadedFile.require 'rack/test
es suficiente.require 'rack/test'
. si está usandoRack::Test::UploadedFile
eso es lo suficientemente bueno como para usarlo. Siempre que la configuración de la aplicación rails esté bien. PD: Estoy encendidoRails 4
yruby 2.1
rack/test
incluirá todo, desde la prueba, que incluyetest/methods
, pero también incluye todo en la prueba, por lo que probablemente sea más de lo que necesita.No he hecho esto usando RSpec, pero tengo una prueba Test :: Unit que hace algo similar para cargar una foto. Configuré el archivo cargado como una instancia de ActionDispatch :: Http :: UploadedFile, de la siguiente manera:
Algo similar podría funcionar para usted también.
fuente
Así es como lo hice
Rails 6
,RSpec
yRack::Test::UploadedFile
NO incluya
ActionDispatch::TestProcess
ni ningún otro código a menos que esté seguro de lo que está incluyendo.fuente
Tuve que agregar ambos de estos incluye para que funcione:
fuente