Я хочу протестировать загрузку файла в рельсы, но не знаю, как это сделать.
Вот код контроллера:
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
Я пробовал эту спецификацию, но она не работает:
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
Как я могу смоделировать загрузку файла с помощью rspec?
ruby-on-rails
file-upload
tdd
rspec-rails
user727403
источник
источник
post
был вспомогательный метод пути, единственный предполагаемый аргумент которого я не заключил в круглые скобки, поэтому следующие токены были интерпретированы как дополнительные аргументы для вспомогательного метода, а не как аргументы для самого сообщения. Например,post order_documents_path @order, document: file
вместоpost order_documents_path(@order), document: file
.Я не уверен, что вы можете тестировать загрузку файлов, используя только RSpec. Вы пробовали Capybara ?
Легко протестировать загрузку файлов с помощью
attach_file
метода capybara из спецификации запроса.Например (этот код является только демонстрационным):
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
источник
если вы включите Rack :: Test *, просто включите методы тестирования
describe "my test set" do include Rack::Test::Methods
тогда вы можете использовать метод UploadedFile:
post "/upload/", "file" => Rack::Test::UploadedFile.new("path/to/file.ext", "mime/type")
* ПРИМЕЧАНИЕ: мой пример основан на Sinatra, который расширяет Rack, но должен работать с Rails, который также использует Rack, TTBOMK
источник
include Rack::Test::Methods
использовать Rack :: Test :: UploadedFile.require 'rack/test
достаточно.require 'rack/test'
. если вы используете,Rack::Test::UploadedFile
этого достаточно, чтобы использовать. При условии, что ваша установка приложения rails в порядке. PS: Я идуRails 4
иruby 2.1
rack/test
будет все от теста, которое включаетtest/methods
, но также включает все в тесте, так что, вероятно, больше, чем вам нужно.Я не делал этого с помощью RSpec, но у меня есть тест Test :: Unit, который делает нечто подобное при загрузке фотографии. Я установил загруженный файл как экземпляр ActionDispatch :: Http :: UploadedFile следующим образом:
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
Что-то подобное может сработать и для вас.
источник
Вот как я это сделал
Rails 6
,RSpec
иRack::Test::UploadedFile
describe 'POST /create' do it 'responds with success' do post :create, params: { license: { picture: Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/test-pic.png"), name: 'test' } } expect(response).to be_successful end end
НЕ включайте
ActionDispatch::TestProcess
любой другой код, если вы не уверены в том, что включаете.источник
Мне пришлось добавить оба этих включения, чтобы заставить его работать:
describe "my test set" do include Rack::Test::Methods include ActionDispatch::TestProcess
источник