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