Patikrinkite failų įkėlimą naudojant rspec - rails

Noriu patikrinti failų įkėlimą į bėgius, bet nežinau, kaip tai padaryti.

Čia yra valdiklio kodas:

 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 

Bandžiau šią specifikaciją, tačiau ji neveikia:

 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 

Kaip galiu imituoti failų įkėlimą naudojant rspec?

122
31 авг. user727403 nustatytas iki rugpjūčio 31 d. 2011-08-31 19:37 '11, 19:37, 2011-08-31 19:37
@ 5 atsakymai

Galite naudoti „ fixture_file_upload“ metodą failų įkėlimui išbandyti: įdėkite testo failą į „{Rails.root} / spec / fixtures / files“ katalogą

 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 

Jei laukėte failo kaip params ['upload'] ['datafile']

 it "can upload a license" do file = Hash.new file['datafile'] = @file post :uploadLicense, :upload => file response.should be_success end 
261
28 нояб. atsakymas pateikiamas ebsbk 28 nov. 2011-11-28 16:16 '11, 16:16, 2011-11-28 16:16

Nesu tikras, kad galite patikrinti failų atsisiuntimą naudodami RSpec. Ar bandėte Capybara ?

Lengvai patikrinkite failų įkėlimą naudodami attach_file metodą iš užklausos specifikacijos.

Pavyzdžiui (šis kodas yra tik demonstracija):

 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 
52
31 авг. atsakymas pateikiamas Ken 31 rug. 2011-08-31 19:54 '11, 19:54, 2011-08-31 19:54

jei įjungėte Rack :: Test *, tiesiog įgalinkite bandymo metodus

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

tada galite naudoti „UploadedFile“ metodą:

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

* PASTABA. Mano pavyzdys paremtas „Sinatra“, kuri išplečia „Rack“, bet turėtų dirbti su „Rails“, kuri taip pat naudoja Rack, TTBOMK

32
15 июня '12 в 21:57 2012-06-15 21:57 atsakymas pateikiamas zedd45 birželio 15 d. 12 val

Aš to nepadariau naudodamas RSpec, bet turiu Test :: Unit testą, kuris daro kažką panašaus įkeliant nuotrauką. Atsisiųstą failą įdiegiau kaip ActionDispatch :: Http :: UploadedFile pavyzdį:

 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 

Kažkas panašaus gali jums padėti.

16
31 авг. atsakymą pateikė Dave Isaacs rugpjūčio 31 d 2011-08-31 20:33 '11, 20:33, 2011-08-31 20:33

Aš turėjau pridėti abu juos, kad tai veiktų:

 describe "my test set" do include Rack::Test::Methods include ActionDispatch::TestProcess 
5
05 апр. atsakymas suteiktas nfriend21 05 balandžio. 2014-04-05 18:01 '14 at 18:01 2014-04-05 18:01