Rspec अनुरोध कल्पना में हेडर कैसे सेट करें?


127

नियंत्रक युक्ति में, मैं http स्वीकार शीर्ष लेख को इस तरह सेट कर सकता हूं:

request.accept = "application/json"

लेकिन अनुरोध युक्ति में, "अनुरोध" वस्तु शून्य है। तो मैं इसे यहां कैसे कर सकता हूं?

मैं http से हेडर स्वीकार करने के लिए जेन्स सेट करना चाहता हूं इसलिए मैं यह कर सकता हूं:

get '/my/path'

इसके अलावा

get '/my/path.json'

जवाबों:


130

आप HTTP हेडर को अपने विवरण के अनुसार तीसरे तर्क के रूप में निर्दिष्ट कर सकते हैं:

http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

और यहाँ

http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html#method-i-process

तो, आप कुछ इस तरह की कोशिश कर सकते हैं:

get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}

3
हमें 'HTTP_ACCEPT':get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
मैट स्किलिपोटी

58
नोट: यह एकीकरण परीक्षण के लिए है, नीचे दिए गए टिप्पणी के समान, rspec- रेल नियंत्रक परीक्षणों में, आप उपयोग करेंगे: request.env ["HTTP_ACCEPT"] =
एलेक्स

5
छोटा गेटचा जो मैं भाग गया क्योंकि मैं मूर्खतापूर्ण हूं: हेडर कीज़ को स्ट्रिंग्स होना चाहिए। प्रतीक नहीं दिखाएंगे।
अज्मुर्मन

@ajmurmann अब प्रतीक काम करते हैं: "प्राधिकरण" शीर्षक हो सकता है :authorization
फ्रैंकलिन यू

13
न्यू आरस्पेक 3 सिंटेक्स get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }' जैसे होगा
सिरिल डचोन-डोरिस

39

मैंने इसे टेस्ट :: यूनिट में उपयोग किया है:

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index

3
इसी प्रकार, जैसा कि एलेक्स सोटो ने एक अन्य उत्तर में, rspec- रेल नियंत्रक परीक्षणों में एक टिप्पणी में नोट किया है, आप इसका उपयोग कर सकते हैं: request.env ["HTTP_ACCEPT"]
gerry3

बहुत बहुत धन्यवाद, केवल उदाहरण है कि मेरे लिए एक पुराने 2.3 एप्लिकेशन पर काम कियाActionController::TestCase
ecoologic

+1 मैंने Cookieहेडर हैश में नामित एक कुंजी का उपयोग करने की कोशिश की (क्योंकि यही मेरा ब्राउज़र भेजता है), लेकिन यह काम नहीं किया। फिर मैंने किया request.keysऔर नाम की चाबी देखी HTTP_COOKIE। का उपयोग कर काम किया। वे वास्तव में इस बेहतर दस्तावेज चाहिए।
केल्विन

यह सचमुच काम करता है! मुझे यह भी जवाब मिला कि github.com/rspec/rspec-rails/issues/65
Stepan

@Sytse Sijbrandij किसी ने भी टेस्ट :: यूनिट के बारे में नहीं पूछा। Rspec के बारे में पूछा गया प्रश्न।
ब्रायन डिमास

18

मैं इसे यहाँ जोड़ रहा हूँ, क्योंकि मैं रेल 5.1.rc1 में इसे करने की कोशिश कर रहा था

अब विधि हस्ताक्षर थोड़ा अलग है।

आपको मार्ग के बाद विकल्प को तर्क वितर्क के रूप में निर्दिष्ट करने की आवश्यकता है, अर्थात

get /some/path, headers: {'ACCEPT' => 'application/json'}

FYI करें, कीवर्ड दलीलों का पूरा सेट है:

params: {}, headers: {}, env: {}, xhr: false, as: :symbol


18

यह नियंत्रक चश्मा के लिए काम कर रहा है, ऐनक के लिए अनुरोध नहीं करता है:

request.headers["My Header"] = "something"

2
यह मेरे लिए काम करता है, यह इस बात पर निर्भर करता है कि आप हेडर को कैसे पुनः प्राप्त कर रहे हैं, यदि आप उपयोग कर रहे हैं request.headersयाrequest.env
एडगर ऑर्टेगा

3
नोट: यह नियंत्रक परीक्षणों के लिए है, न कि प्रश्न में वर्णित एकीकरण परीक्षण।
फ्रैंकलिन यू

3
एकीकरण परीक्षणों के लिए काम नहीं किया। नियंत्रक परीक्षणों के साथ काम करता है, हालांकि।
पेट्र गजारोव

9

मुझे अलग से हेडर सेट करने होंगे

request.headers["Accept"] = "application/json"

इसे पाने / हटाने / .... के माध्यम से भेजने की कोशिश rails4 में पूरा कचरा है और मेरे सिर में दर्द होता है क्योंकि यह हेडर के रूप में लेकिन पैरामीटर के रूप में कभी नहीं भेजा जाता है।

{"Accept" => "application/json"}

5
क्या यह वास्तव में ओपी प्रश्न का उत्तर प्रदान करता है? यदि यह एक नया प्रश्न है, तो एक नया प्रश्न खोलना बेहतर है।
β.βοιτ.βε

9

के साथ rspec का उपयोग करना Rack::Test::Methods

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

हेडर संस्करण के रूप में के माध्यम से आ जाएगा X-Your-Header-Var


नोट: यह Test::UnitRSpec के लिए नहीं है।
फ्रैंकलिन यू

इसके संकेत rspec
जेम्स टैन

1
हाँ। Rspec में यह ndefined method 'header'मेरे लिए त्रुटि उठाता है।
енвгений Масленков

7

RSpec 3 के साथ आप निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }

जैसा कि आधिकारिक Rspec प्रलेखन में वर्णित है (v3.7 के लिए लिंक अंक)


मिठाई। मुझे इसकी ही खोज थी। धन्यवाद!
फ्रांसिस्को क्विंटो

5

दोनों xhr: trueऔर हेडर भेजने के लिए , मुझे करना था जैसे:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers

1
यहाँ GitHub पर स्रोत कोड है: github.com/rails/rails/blob/…
Karl Wilbur

नहीं headers =होना चाहिए my_headers =?
वेबहोलिक

फिक्स्ड। साभार @webaholik
जिम स्टीवर्ट

2

आपके सवाल का पहले ही जवाब दे दिया गया था, लेकिन यदि आप किसी अन्य कार्रवाई के लिए कुछ करना चाहते हैं तो आपको यह करना होगा:

post :save, {format: :json, application: {param1: "test", param2: "test"}}

2

कुछ इस तरह की कोशिश करें:

get :index, :format => 'json' 

यकीन नहीं है, लेकिन शायद काम करता है क्योंकि रेल उस मार्ग के लिए बेहतर है। यह मेरे लिए भी काम हुआ।
एलन

2
अगर किसी को आश्चर्य हो रहा है, तो यह सिर्फ format=jsonएक क्वेरी परम के रूप में जोड़ता है । हेडर फ़ील्ड के समान नहीं है।
केविन कारमोडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.