আরএসপেক - রেল ব্যবহার করে একটি ফাইল আপলোড পরীক্ষা করুন


142

আমি রেলগুলিতে একটি ফাইল আপলোড পরীক্ষা করতে চাই, তবে এটি কীভাবে করবেন তা সম্পর্কে নিশ্চিত নই।

নিয়ামক কোডটি এখানে:

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

আমি কীভাবে ফাইল আপলোড অনুকরণ করতে পারি, আরএসপিসি ব্যবহার করে?

উত্তর:


291

আপনি ফাইল আপলোড পরীক্ষা করার জন্য ফিক্সচার_ফাইল_আপলোড পদ্ধতিটি ব্যবহার করতে পারেন : "{Rails.root} / spec / fixtures / ফাইল" ডিরেক্টরিতে আপনার পরীক্ষা ফাইলটি রাখুন

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

আপনি যদি ফাইলগুলি পরম আকারে ['আপলোড'] ['ডেটা ফাইল '] আকারে প্রত্যাশা করছিলেন

it "can upload a license" do
  file = Hash.new
  file['datafile'] = @file
  post :uploadLicense, :upload => file
  response.should be_success
end

8
এটি উত্তর হিসাবে চিহ্নিত করা উচিত, কারণ এটি সঠিক। ধন্যবাদ মানুষ!
এমিল আহলব্যাক

30
বিট.ইলি / ইউএসএলএলআরআর দেখুন (ওভারফ্লো প্রশ্ন 3966263 স্ট্যাক করুন) যদি আপনি ফাইলটি পান তবে ত্রুটির উপস্থিতি নেই। Ails.২: @ ফাইল: রেক :: টেস্ট :: আপলোডডফিল.নেইউ (রেলস.রোট.জয়াইন ('স্পেস / ফিক্সার / ফাইল / টেস্ট.সিএসভি'), 'টেক্সট / সিএসভি')
মাইক

3
আপনি যদি ফাইলটির পুরো পথ নির্দিষ্ট করে থাকেন তবে ফিক্সচার_ফাইল_আপলোডও কাজ করে: "Rails.root.join ('spec / fixtures / ফাইল / test.csv"
jmanrubia

1
ফিচার_ফাইল_আপলোডকে প্যারামে স্ট্রিং হিসাবে বিবেচনা করা হচ্ছে, কেউ জানেন কেন?
আবে পেট্রিলো

3
@ আবেপেট্রিলো (বা যে মন্তব্যটি দেখে এবং একই প্রশ্ন রয়েছে) আমারও একই সমস্যা ছিল। আমার ক্ষেত্রে, প্রথম আর্গুমেন্টটি postপ্যাস হেল্পার পদ্ধতি ছিল, যার একমাত্র উদ্দেশ্যে যুক্তিটি আমি বন্ধনীতে আবদ্ধ করি নি, সুতরাং নীচের টোকেনগুলি পোস্টের জন্য আরোগুলির চেয়ে সাহায্যকারীকে অতিরিক্ত আরগ হিসাবে ব্যাখ্যা করা হয়েছিল। উদাহরণস্বরূপ, আমার post order_documents_path @order, document: fileপরিবর্তে ছিল post order_documents_path(@order), document: file
স্যুপডগ

54

আপনি একা আরএসপেক ব্যবহার করে ফাইল আপলোড পরীক্ষা করতে পারবেন কিনা তা সম্পর্কে আমি নিশ্চিত নই। আপনি ক্যাপিবারা চেষ্টা করেছেন ?

attach_fileএকটি অনুরোধ নির্দিষ্ট থেকে ক্যাপিবার পদ্ধতি ব্যবহার করে ফাইল আপলোডগুলি পরীক্ষা করা সহজ ।

উদাহরণস্বরূপ (এই কোডটি কেবল একটি ডেমো):

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

6
অবশ্যই এটি একটি ইন্টিগ্রেশন বৈশিষ্ট্যে কাজ করে। ওপির প্রশ্নটি একটি নিয়ামক ইউনিট সম্পর্কিত বিষয়ে, তিনি কেবল পোস্টিং কন্ট্রোলার কোড বিবেচনা করে। কারও বিভ্রান্ত হলে শুধু বলছি। একটি বৈশিষ্ট্য বৈশিষ্ট্যে এটি করুন, একটি ইউনিট স্পেসে ebsbk এর উত্তরটি করুন।
শুরু

2
ফাইল পাথের উদ্ধৃতিগুলি থাকা দরকার
ষোলটিবিট

32

যদি আপনি র্যাক :: টেস্ট * অন্তর্ভুক্ত করেন তবে কেবল পরীক্ষার পদ্ধতিগুলি অন্তর্ভুক্ত করুন

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

তারপরে আপনি আপলোডড ফাইল পদ্ধতিটি ব্যবহার করতে পারেন:

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

* দ্রষ্টব্য: আমার উদাহরণ সিনট্রা ভিত্তিক, যা র্যাককে প্রসারিত করে, তবে রেলের সাথে কাজ করা উচিত, যা র্যাক, টিটিবমকেও ব্যবহার করে


3
এফওয়াইআই: আপনাকে অবশ্যই include Rack::Test::Methodsর্যাক :: টেস্ট :: আপলোডড ফাইল ব্যবহার করতে হবে না । require 'rack/testযথেষ্ট।
xentek

3
আমারও নেই require 'rack/test'। আপনি যদি Rack::Test::UploadedFileএটি ব্যবহার করেন তবে এটি যথেষ্ট ভাল। আপনার রেলের অ্যাপ সেটআপ ঠিক আছে ided পিএস: আমি আছি Rails 4এবংruby 2.1
বিষ্ণু নারং

বিষ্ণুর মন্তব্য সবচেয়ে নির্ভুল, কারণ তিনি স্পষ্টভাবে পদ্ধতিটির প্রয়োজন requ সহ rack/testপরীক্ষা, যার মধ্যে থেকে সবকিছু অন্তর্ভুক্ত করা হবে test/methods, কিন্তু অন্তর্ভুক্ত সবকিছু পরীক্ষা, তাই সম্ভবত আরো আপনি প্রয়োজন।
zedd45

18

আমি আরএসপেক ব্যবহার করে এটি করিনি, তবে আমার কাছে একটি পরীক্ষা :: ইউনিট পরীক্ষা আছে যা কোনও ছবি আপলোড করার জন্য অনুরূপ কিছু করে। আমি অ্যাকশনডিস্পাচ :: এইচটিটিপি :: আপলোডড ফাইলের উদাহরণ হিসাবে আপলোড করা ফাইলটি সেট আপ করেছি:

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

অনুরূপ কিছু আপনার জন্য কাজ করতে পারে।


6

এইভাবেই আমি এটি দিয়েছিলাম 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আপনি কী অন্তর্ভুক্ত করছেন সে সম্পর্কে নিশ্চিত না হওয়া পর্যন্ত অন্য কোনও কোড অন্তর্ভুক্ত করবেন না


4

এটির কাজ পেতে আমাকে এই দুটিও অন্তর্ভুক্ত করতে হয়েছিল:

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

1
অ্যাকশনডিস্প্পাচ :: টেস্টপ্রসেসের ব্যাখ্যাটি কখনই অন্তর্ভুক্ত করবেন না: github.com/honeybadger-io/honeybadger-ruby/blob/…
গোটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.