проверить загрузку файла с помощью rspec - rails - PullRequest
136 голосов
/ 31 августа 2011

Я хочу проверить загрузку файла в рельсах, но не уверен, как это сделать.

Вот код контроллера:

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?

Ответы [ 5 ]

284 голосов
/ 28 ноября 2011

Вы можете использовать fixture_file_upload для проверки загрузки файла: поместите ваш тестовый файл в "{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

В случае, если вы ожидаете файл в виде params ['upload'] ['datafile']

it "can upload a license" do
  file = Hash.new
  file['datafile'] = @file
  post :uploadLicense, :upload => file
  response.should be_success
end
53 голосов
/ 31 августа 2011

Я не уверен, что вы можете проверить загрузку файлов, используя только RSpec. Вы пробовали Капибара ?

Загрузку файлов легко проверить с помощью метода 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
32 голосов
/ 15 июня 2012

если вы включите 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

16 голосов
/ 31 августа 2011

Я не делал этого с помощью RSpec, но у меня есть Test :: Unit test, который делает нечто подобное для загрузки фотографии.Я настроил загруженный файл как экземпляр 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

Нечто подобное может работать и для вас.

5 голосов
/ 05 апреля 2014

Мне пришлось добавить оба этих включения, чтобы оно заработало:

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