Raylarda dosya yüklemesini nasıl test ederim?


102

JSON dosyalarını kabul etmekten ve ardından uygulamamız için bazı kullanıcı bakımlarını yapmak üzere JSON dosyalarını işlemekten sorumlu bir denetleyicim var. Kullanıcı testinde dosya yükleme ve işleme çalışır, ancak tabii ki testimizde kullanıcı bakımını test etme sürecini otomatikleştirmek istiyorum. İşlevsel test çerçevesindeki bir denetleyiciye nasıl dosya yükleyebilirim?

Yanıtlar:


110

Bu soruyu aradım ve soruyu veya yanıtını Stack Overflow'da bulamadım, ancak başka bir yerde buldum, bu yüzden SO'da kullanılabilir olmasını istiyorum.

Raylar çerçevesi, belirtilen dosya için armatürler dizininizde arama yapacak ve işlevsel testte kontrolör için bir test dosyası olarak kullanıma sunacak bir işleve fixture_file_upload( Rails 2 Rails 3 , Rails 5 ) sahiptir. Kullanmak için:

1) Teste yüklenecek dosyanızı test etmek için fikstür / dosyalar alt dizinine koyun.

2) Birim testinizde, fixture_file_upload ('yol', 'mime-türü') çağırarak test dosyanızı alabilirsiniz.

Örneğin:

bulk_json = fixture_file_upload('files/bulk_bookmark.json','application/json')

3) yükleme için parametre olarak fixture_file_upload tarafından döndürülen nesneyi ileterek, istediğiniz denetleyici eylemini vurmak için post yöntemini çağırın.

Örneğin:

post :bookmark, :bulkfile => bulk_json

Veya Raylar 5'te: post :bookmark, params: {bulkfile: bulk_json}

Bu, fikstür dizininizdeki dosyanın bir Tempfile kopyasını kullanarak simüle edilmiş post sürecinden geçecek ve daha sonra, gönderinin sonuçlarını incelemeye başlayabilmeniz için birim testinize dönecektir.


2
Bu raylar 3 üzerinde çalışmaz. Action_controller / test_process dosyası activesupport 3'te mevcut değil gibi görünüyor. Burada aynısı için yeni bir soru açtım - stackoverflow.com/questions/3966263/…
Chirantan

Cevabınızdaki bağlantı 404, yoksa sadece benim için mi?
Ernest

@Chirantan, ActionDispatch'e taşındı :: TestProcess
ben yazar

Bu FactoryGirl ile nasıl kullanılabilir? stackoverflow.com/questions/34677780/…
Richlewis

86

Mori'nin cevabı doğru, ancak "ActionController :: TestUploadedFile.new" yerine "Rack :: Test :: UploadedFile.new" kullanmanız gerekmesi dışında Rails 3'te.

Oluşturulan dosya nesnesi daha sonra Rspec veya TestUnit testlerinde bir parametre değeri olarak kullanılabilir.

test "image upload" do
  test_image = path-to-fixtures-image + "/Test.jpg"
  file = Rack::Test::UploadedFile.new(test_image, "image/jpeg")
  post "/create", :user => { :avatar => file }
  # assert desired results
  post "/create", :user => { :avatar => file }     

  assert_response 201
  assert_response :success
end

Bu yöntem, armatürleriniz / test / armatürler içinde bulunmadığında güzel bir alternatiftir. Örneğin, testler için dinamik olarak bazı dosyalar oluşturursanız, bunlar bunun yerine / tmp klasöründe olabilir.
Olivier Amblet

25

Yeni ActionDispatch :: Http :: UploadedFile'ı bu şekilde kullanmanın daha iyi olacağını düşünüyorum:

uploaded_file = ActionDispatch::Http::UploadedFile.new({
    :tempfile => File.new(Rails.root.join("test/fixtures/files/test.jpg"))
})
assert model.valid?

Bu şekilde, doğrulamalarınızda kullandığınız yöntemlerin aynısını kullanabilirsiniz (örneğin, geçici dosya).


8

The Rspec Book, B13.0'dan:

Rails ', bir denetleyici spesifikasyonunun params hash'inde yüklenen bir dosyayı temsil etmek için kullanılabilen bir ActionController :: TestUploadedFile sınıfı sağlar, örneğin:

describe UsersController, "POST create" do
  after do
    # if files are stored on the file system
    # be sure to clean them up
  end

  it "should be able to upload a user's avatar image" do
    image = fixture_path + "/test_avatar.png"
    file = ActionController::TestUploadedFile.new image, "image/png"
    post :create, :user => { :avatar => file }
    User.last.avatar.original_filename.should == "test_avatar.png"
  end
end

Bu spesifikasyon, spesifikasyon / fikstürler dizininde bir test_avatar.png resminizin olmasını gerektirir. Bu dosyayı alır, denetleyiciye yükler ve denetleyici gerçek bir Kullanıcı modeli oluşturur ve kaydeder.


2
Bu kodla bir test çalıştırdığımda "başlatılmamış sabit ActionController :: TestUploadedFile" hatası alıyorum. Dosyada ihtiyacım olan başka bir şey var mı?
Vini.g.fer

1
Rails 2.3 gibi erken bir tarihte kullanımdan kaldırılmış gibi görünüyor. Rails 3.0 ve sonrası için, fikstür kullanarak bunu şu şekilde yapabilirsiniz
Sebastialonso


1

Varsayılan ray kullanıyorsanız, fabrika kızıyla test edin. Kodun altında ince.

factory :image_100_100 do
    image File.new(File.join(::Rails.root.to_s, "/test/images", "100_100.jpg"))
end

Not: Sahte bir görüntüyü içeride tutmanız gerekecektir /test/images/100_100.jpg.

Mükemmel çalışıyor.

Şerefe!


0

Dosyayı aşağıdaki gibi kontrol cihazınıza alıyorsanız

json_file = params[:json_file]
FileUtils.mv(json_file.tempfile, File.expand_path('.')+'/tmp/newfile.json')

ardından özelliklerinizde aşağıdakileri deneyin:

json_file = mock('JsonFile')
json_file.should_receive(:tempfile).and_return("files/bulk_bookmark.json")
post 'import', :json_file => json_file
response.should be_success

Bu, sahte yöntemi 'tempfile' yöntemine dönüştürür ve bu da yüklenen dosyanın yolunu döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.