मैं रेल फ़ाइल अपलोड कैसे करूं?


102

मेरे पास एक नियंत्रक है जो JSON फ़ाइलों को स्वीकार करने और फिर JSON फ़ाइलों को संसाधित करने के लिए हमारे अनुप्रयोग के लिए कुछ उपयोगकर्ता रखरखाव करने के लिए जिम्मेदार है। उपयोगकर्ता परीक्षण में फ़ाइल अपलोड और प्रसंस्करण कार्य करता है, लेकिन निश्चित रूप से मैं हमारे परीक्षण में उपयोगकर्ता रखरखाव के परीक्षण की प्रक्रिया को स्वचालित करना चाहूंगा। मैं फंक्शनल टेस्टिंग फ्रेमवर्क में एक कंट्रोलर में एक फाइल कैसे अपलोड कर सकता हूँ?

जवाबों:


110

इस प्रश्न के लिए खोज की गई और इसे स्टैक ओवरफ्लो पर इसका जवाब नहीं मिला, लेकिन इसे कहीं और मिला, इसलिए मैं इसे एसओ पर उपलब्ध कराने के लिए कह रहा हूं।

रेल फ्रेमवर्क का एक फंक्शन है fixture_file_upload( रेल्स 2 रेल्स 3 , रेल्स 5 ), जो निर्दिष्ट फ़ाइल के लिए आपके फिक्स्चर निर्देशिका को खोजेगा और इसे कार्यात्मक परीक्षण में नियंत्रक के लिए परीक्षण फ़ाइल के रूप में उपलब्ध कराएगा। इसके प्रयेाग के लिए:

1) अपनी फ़ाइल को परीक्षण में अपलोड करने के लिए अपने फिक्स्चर / परीक्षण के लिए उपनिर्देशिका में रखें।

2) अपने यूनिट टेस्ट में आप fixture_file_upload ('पाथ', 'माइम-टाइप') कॉल करके अपनी टेस्टिंग फाइल प्राप्त कर सकते हैं।

उदाहरण के लिए:

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

3) कंट्रोलर एक्शन को हिट करने के लिए पोस्ट मेथड को कॉल करें, अपलोड के लिए पैरामीटर के रूप में fixture_file_upload द्वारा लौटाए गए ऑब्जेक्ट को पास करना।

उदाहरण के लिए:

post :bookmark, :bulkfile => bulk_json

या रेल में 5: post :bookmark, params: {bulkfile: bulk_json}

यह आपके जुड़नार निर्देशिका में फ़ाइल की एक Tempfile प्रतिलिपि का उपयोग करके सिम्युलेटेड पोस्ट प्रक्रिया के माध्यम से चलेगा और फिर अपनी इकाई परीक्षा में वापस आ जाएगा ताकि आप पोस्ट के परिणामों की जांच शुरू कर सकें।


2
यह रेल 3 पर काम नहीं करता है। एक्शन_कंट्रोलर / टेस्ट_प्रोसेस फाइल एक्टिवास्पोर्ट 3 में उपलब्ध नहीं है। मैंने उसी के लिए एक नया प्रश्न खोला है - stackoverflow.com/questions/3966263/…
चिरंतन

आपके उत्तर की लिंक 404 है, या यह सिर्फ मेरे लिए है?
अर्नेस्ट

@Cirantan यह ActionDispatch :: TestProcess
ben

FactoryGirl के साथ इसका उपयोग कैसे किया जा सकता है? stackoverflow.com/questions/34677780/…
रिचलेविस

85

मोरी का जवाब सही है, सिवाय इसके कि "एक्शनकंट्रोलर :: TestUploadedFile.new" के बजाय रेल 3 में आपको "रैक :: टेस्ट :: UploadedFile.new" का उपयोग करना होगा।

तब बनाई गई फ़ाइल ऑब्जेक्ट को Rspec या TestUnit परीक्षणों में एक पैरामीटर मान के रूप में उपयोग किया जा सकता है।

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

यह विधि एक अच्छा विकल्प है जब आपके जुड़नार / परीक्षण / जुड़नार में स्थित नहीं होते हैं। यदि आप उदाहरण के लिए परीक्षणों के लिए गतिशील रूप से कुछ फाइलें उत्पन्न करते हैं, तो वे इसके बजाय / tmp फ़ोल्डर में हो सकते हैं।
ओलिवियर एंबलेट

25

मुझे लगता है कि नए ActionDispatch :: Http :: UploadedFile को इस तरह इस्तेमाल करना बेहतर है:

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

इस तरह से आप उन्हीं विधियों का उपयोग कर सकते हैं, जिनका आप अपनी मान्यताओं में उपयोग कर रहे हैं (उदाहरण के लिए अस्थायी रूप से)।


8

द आरस्पेक बुक, B13.0 से:

रेल 'एक्शनकंट्रोलर :: TestUploadedFile क्लास प्रदान करता है, जिसका उपयोग किसी नियंत्रक युक्ति के परम हैश में अपलोड की गई फ़ाइल को दर्शाने के लिए किया जा सकता है, जैसे:

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

इस युक्ति की आवश्यकता होगी कि आपके पास युक्ति / जुड़नार निर्देशिका में एक test_avatar.png चित्र है। यह उस फ़ाइल को लेगा, उसे कंट्रोलर पर अपलोड करेगा, और कंट्रोलर एक वास्तविक यूजर मॉडल बनाएगा और सेव करेगा।


2
जब मुझे इस कोड के साथ एक परीक्षण चलाना होता है, तो मुझे "अनइंस्टाल्ड कंटिन्यू एक्शनकंट्रोलर :: TestUploadedFile" त्रुटि मिलती है। कुछ और मुझे फ़ाइल में आवश्यकता होगी?
विनी.ग्रे

1
यह रेल 2.3 के रूप में जल्दी से पदावनत हो रहा है। रेल 3.0 के लिए, यहाँ आप इसे कैसे जुड़नार का उपयोग कर रहे हैं
सेबस्टीलोनसो

4

आप उपयोग करना चाहते हैं fixtures_file_upload । आप अपनी परीक्षण फ़ाइल को जुड़नार निर्देशिका की एक उपनिर्देशिका में डाल देंगे और फिर जुड़नार_फाइल_अपलोड के पथ में गुजरेंगे। यहाँ कोड का एक उदाहरण है , जो फिक्सेटर फ़ाइल अपलोड का उपयोग कर रहा है


1

यदि आप कारखाने की लड़की के साथ डिफ़ॉल्ट रेल परीक्षण का उपयोग कर रहे हैं। कोड के नीचे ठीक है।

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

नोट: आपको एक डमी छवि रखनी होगी /test/images/100_100.jpg

यह पूरी तरह से काम करता है।

चीयर्स!


0

यदि आपको निम्न के साथ आपके नियंत्रक में फ़ाइल मिल रही है

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

तो अपने चश्मे में निम्नलिखित का प्रयास करें:

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

यह फर्जी तरीके से p टेम्पोफाइल ’विधि का निर्माण करेगा, जो लोड की गई फ़ाइल का मार्ग लौटाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.