2009-11-12 12 views
7

मैं एक साधारण रेल परियोजना में नियंत्रक ('पार्स') विधि ('अनुक्रमणिका') में POST के माध्यम से XML सामग्री भेजने की कोशिश कर रहा हूं। यह बिल्कुल सही नहीं है क्योंकि मेरा मॉडल नाम अलग है, कहें, 'कार'। मैं एक कार्यात्मक परीक्षण है कि काम करता है में निम्नलिखित है:ककड़ी से HTTP पोस्ट XML सामग्री

def test_index 
    ... 
    data_file_path = File.dirname(__FILE__) + 
     '/../../app/views/layouts/index.xml.erb' 

    message = ERB.new(File.read(data_file_path)) 
    xml_result = message.result(binding) 
    doc = REXML::Document.new xml_result 

    @request.env['RAW_POST_DATA'] = xml_result 
    post :index 
    assert_response :success 
end 

मैं अब ककड़ी (0.4.3) कोशिश कर रहा हूँ, और कैसे मैं एक "जब" खंड में पोस्ट अनुरोध अनुकरण कर सकते हैं के रूप में जानना चाहते हैं। मैं केवल एक नियंत्रक विधि 'सूचकांक' है, और मुझे config/routes.rb में निम्नलिखित है:

ActionController::Routing::Routes.draw do |map| 
    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 
end 
  1. ककड़ी भीतर webrat केवल HTML के लिए है, और ऐसा नहीं कर सकते पोस्ट?
  2. @request चर ककड़ी पर्यावरण से उपलब्ध नहीं है?
  3. अगर मैं की तरह 'यात्रा सूचकांक' कुछ का उपयोग (यह मानते हुए यह है पार्स नियंत्रक, सूचकांक विधि) में सुविधाओं/step_definitions/car_steps.rb, मैं निम्नलिखित त्रुटि मिलती है:

undefined method `index' for # (NoMethodError)

पर किसी भी सुझाव की सराहना XML सामग्री के साथ HTTP पोस्ट के लिए ककड़ी के साथ एकीकरण परीक्षण कैसे करें।

+0

@mbuf, यदि उत्तर में से किसी एक ने आपकी समस्या का समाधान किया है तो आपको इसे मतदान क्षेत्र के नीचे चेकमार्क पर क्लिक करके "उत्तर" के रूप में चिह्नित करना चाहिए। –

+0

हो गया। मुझे बताने के लिए धन्यवाद! – mbuf

+0

मैंने पोस्ट किया है कि यहां रेल और ककड़ी का उपयोग करके JSON POST का परीक्षण कैसे करें: http://stackoverflow.com/questions/5098626/how-to-test-posts-in-rails-capybara-cucumber-or-rspec/10404063# 10404063 –

उत्तर

11

Webrat यहां आपकी सहायता नहीं करेगा, यह ब्राउज़र आधारित इंटरैक्शन के लिए है, इसलिए यदि आप एपीआई की कल्पना कर रहे हैं तो इससे मदद नहीं मिलेगी।

आप ककड़ी में 'पोस्ट' का उपयोग कर सकते हैं लेकिन आपको केवल कार्रवाई के लिए कार्रवाई के लिए पूरा मार्ग प्रदान करने की आवश्यकता नहीं है। साथ ही, सामग्री-प्रकार शीर्षलेख में पास करें ताकि रेल जानता है कि आप XML में गुजर रहे हैं।

post("/controller/index", xml_result, {"Content-type" => "text/xml"}) 

प्रतिक्रिया ओर आप कर सकते हैं पर निम्नलिखित:

response.should be_success 
+0

बिंगो! आपकी सहायता के लिए धन्यवाद. – mbuf

+0

स्वीकृत। आपके प्रतिक्रिया के लिए धन्येवाद! – mbuf

12

पैट्रिक रिची के समाधान मुझे बाहर भी मदद की, लेकिन मैं इसे रेल के साथ काम करने के लिए एक मामूली संशोधन बनाने के लिए आवश्यक 3.

post("/controller/index", xml_result, {"CONTENT_TYPE" => "text/xml"}) 

मुझे लगता है कि ऐसा इसलिए है क्योंकि, v3 में, रेल रैक के साथ अधिक कड़ाई से एकीकृत है।

1

धन्यवाद बहुत सारे लोग, मैंने पूरे दिन शपथ ली है। मैं बुनियादी प्रमाणीकरण और जेसन के साथ एक उदाहरण जोड़ूंगा, अगर मेरे अलावा अन्य लोग इसकी तलाश में हैं। बीटीडब्ल्यू, application/xml और text/xml दोनों काम करता है, लेकिन जेसन के लिए आपको application/json की आवश्यकता है।

post("/myresource.xml", 
    some_xml_string, 
    {"CONTENT_TYPE" => "text/xml", 
     "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")}) 

और JSON

post("/myresource.json", 
     some_json_string, 
     {"CONTENT_TYPE" => "application/json", 
     "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")}) 

और मैं किसी भी webrat या capybara ब्राउज़र सामान के बिना spec/requests में इन का उपयोग करें।

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