2010-03-01 6 views
31

अपने नियंत्रक कार्रवाई इस तरह दिखाई देता है:रेल में, आप जावास्क्रिप्ट प्रतिक्रिया प्रारूप का परीक्षण कैसे करते हैं?

respond_to do |format| 
    format.html { raise 'Unsupported' } 
    format.js # index.js.erb 
end 

और अपने कार्यात्मक परीक्षण इस तरह दिखता है:

test "javascript response..." do 
    get :index 
end 

यह respond_to ब्लॉक के एचटीएमएल शाखा निष्पादित करेंगे।

आप इस प्रयास करें:

test "javascript response..." do 
    get 'index.js' 
end 

यह (index.js.erb) नियंत्रक कार्रवाई चलाए बिना निष्पादित करता है!

उत्तर

55

:format में अपने सामान्य पैरा के साथ उस प्रारूप में प्रतिक्रिया को ट्रिगर करने के लिए पास करें।

get :index, :format => 'js' 

आपके अनुरोध शीर्षलेखों के साथ गड़बड़ करने की कोई आवश्यकता नहीं है।

it "should render js" do 
    xhr :get, 'index' 
    response.content_type.should == Mime::JS 
end 

और अपने नियंत्रक कार्रवाई में:

+2

नोट, रेल 3 में आप प्रतीक का उपयोग कर सकते हैं, neater दिखता है। 'प्राप्त करें: अनुक्रमणिका, प्रारूप:: जेएस' – dazonic

+9

@ डेज़ोनिक क्या आप वाकई रूबी 1.9 के कारण नहीं हैं? –

+0

2016 अपडेट: https://github.com/rspec/rspec-rails/issues/950। यह InvalidCrossOriginRequest त्रुटि को बढ़ाएगा। नीचे @steven से उत्तर का उपयोग करें :) –

3

उपयोग इस अनुरोध से पहले:

@request.env['HTTP_ACCEPT'] = 'text/javascript' 
5

प्रकार के स्वीकृत सामग्री प्रकार सेट करें आप चाहते हैं:

@request.accept = "text/javascript" 

अपने get :index परीक्षण के साथ इस कम्बाइन और यह नियंत्रक के लिए उपयुक्त कॉल कर देगा ।

1

इन तीन बराबर होने लगते हैं:

  1. get :index, :format => 'js'
  2. @request.env['HTTP_ACCEPT'] = 'text/javascript'
  3. @request.accept = "text/javascript"

वे नियंत्रक एक js टेम्पलेट का उपयोग करने के लिए कारण (जैसे index.js.erb)

एक XHR अनुरोध (एक HTML स्निपेट) जैसे प्राप्त करने के लिए आप इस का उपयोग कर सकते अनुकरण जबकि: @request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"

यह request.xhr मतलब है? सच हो जाएगा।

ध्यान दें कि, जब एक्सएचआर अनुकरण, मैं था उम्मीद प्रारूप निर्दिष्ट करने के लिए या मैं एक त्रुटि मिली:

get :index, format: "html"

ऑन रेल्स 3.0.3 परीक्षण किया गया।

मैं यहाँ रेल स्रोत से बाद मिला,: https://github.com/rails/rails/blob/6c8982fa137421eebdc55560d5ebd52703b65c65/actionpack/lib/action_dispatch/http/request.rb#L160 इस तरह

+1

@ request.env के साथ गड़बड़ करने के बजाय, एक एक्सएचआर अनुरोध अनुकरण करने के लिए, प्रदान किए गए सहायक का उपयोग करने के लिए बेहतर: xhr: get,: index, format: "html" – Nick

0

उपयोग कोड मापदंडों और प्रयोक्ता आईडी, आदि के लिए, ध्यान दें कि प्रारूप विकल्प आईडी और nested_attributes जैसे अन्य मानकों का एक ही हैश में है।

put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id 
0

उपरोक्त में से कई उत्तर पुराने हैं।

आरएसपीईसी 3+ में ऐसा करने का सही तरीका post some_path, xhr: true है। RSpec ही है, से

अस्वीकार्यता चेतावनी सीधे जब xhr :post, "some_path" उपयोग करने का प्रयास:

DEPRECATION WARNING: `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1. 
Switch to e.g. `post comments_path, params: { comment: { body: 'Honey bunny' } }, xhr: true`. 

इसके अलावा, xhr :post, "some_path" परिणाम कुछ अजीब त्रुटियों में है कि post some_path, xhr: true साथ नहीं होता है।

संबंधित मुद्दे