with tutorial tests test run rails how ruby-on-rails file-upload tdd rspec-rails

ruby-on-rails - tutorial - rspec with rails



prueba una carga de archivo usando rspec-rails (5)

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?


No estoy seguro si puede probar las cargas de archivos usando RSpec solo. ¿Has probado Capybara ?

Es fácil probar las cargas de archivos utilizando el método attach_file de attach_file desde una especificación de solicitud.

Por ejemplo (este código es solo una demostración):

it "can upload a license" do visit upload_license_path attach_file "uploadLicense", /path/to/file/to/upload click_button "Upload License" end it "can download an uploaded license" do visit license_path click_link "Download Uploaded License" page.should have_content("Uploaded License") end


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:

test "should create photo" do setup_file_upload assert_difference(''Photo.count'') do post :create, :photo => @photo.attributes end assert_redirected_to photo_path(assigns(:photo)) end def setup_file_upload test_photo = ActionDispatch::Http::UploadedFile.new({ :filename => ''test_photo_1.jpg'', :type => ''image/jpeg'', :tempfile => File.new("#{Rails.root}/test/fixtures/files/test_photo_1.jpg") }) @photo = Photo.new( :title => ''Uploaded photo'', :description => ''Uploaded photo description'', :filename => test_photo, :public => true) end

Algo similar podría funcionar para ti también.


Puede usar el método fixture_file_upload para probar la carga de archivos: fixture_file_upload su archivo de prueba en el directorio "{Rails.root} / spec / fixtures / files"

before :each do @file = fixture_file_upload(''files/test_lic.xml'', ''text/xml'') end it "can upload a license" do post :uploadLicense, :upload => @file response.should be_success end

En caso de que esperaras el archivo en forma de params [''upload''] [''datafile'']

it "can upload a license" do file = Hash.new file[''datafile''] = @file post :uploadLicense, :upload => file response.should be_success end


Tuve que agregar ambos para que funcione:

describe "my test set" do include Rack::Test::Methods include ActionDispatch::TestProcess


si incluye Rack :: Test *, simplemente incluya los métodos de prueba

describe "my test set" do include Rack::Test::Methods

entonces puedes usar el método UploadedFile:

post "/upload/", "file" => Rack::Test::UploadedFile.new("path/to/file.ext", "mime/type")

* NOTA: Mi ejemplo se basa en Sinatra, que amplía Rack, pero debería funcionar con Rails, que también usa Rack, TTBOMK