2012-12-18 16 views
9

के लिए सामग्री-प्रकार शीर्षलेख सेट करना मैं वेब सेवा बनाने के लिए rails-api मणि का उपयोग कर रहा हूं और आरएसपीसी के साथ अपने एपीआई का परीक्षण करना चाहता हूं। HTTP विधि के बावजूद मैं जो भी अनुरोध करता हूं, उसके पास CONTENT_TYPE हैडर सेट "एप्लिकेशन/एक्स-www-form-urlencoded" के रूप में सेट है। यह वास्तव में एक समस्या है जब तक मैं अपने नियंत्रक में wrap_parameters उपयोग करने के लिए कोशिश करते हैं और यह नहीं है किसी भी पैरामीटर हैश पर कोई असर नहीं है:आरएसपीसी और रेल-एपीआई

class ApplicationController < ActionController::API 
    include ActionController::ParamsWrapper 
end 

class ProjectsController < ApplicationController 
    wrap_parameters :project, include: [:name] 
    # ... 
end 

This hack अब काम नहीं करता (@request नहीं के बराबर है), और अन्य में से कोई भी स्टैक ओवरफ़्लो पोस्ट मुझे या तो काम मिला।

अगर मैं अपने RSpec परीक्षा में निम्न अनुरोध करना:

put "/projects/1.json", {name: 'Updated Project 1'} 

और मेरे नियंत्रक में एक डिबगर डाल मैं:

(rdb:1) p params 
    { "name"=>"Updated Project 1", 
    "action"=>"update", 
    "controller"=>"projects", 
    "id"=>"5539bbd9-010c-4cfb-88d3-82dadbc99507", 
    "format"=>"json" 
} 

(rdb:1) p request.content_type 
"application/x-www-form-urlencoded" 

मैं के लिए कुछ इस तरह देखने की उम्मीद कर रहा हूँ पैरामीटर हैश (परियोजना प्रमुख के अलावा ध्यान दें):

{ "name"=>"Updated Project 1", 
    "action"=>"update", 
    "controller"=>"projects", 
    "id"=>"5539bbd9-010c-4cfb-88d3-82dadbc99507", 
    "format"=>"json", 
    "project" => {"name" => "Updated Project 1"} 
} 

यह है बस RSpec का उपयोग कर सामग्री प्रकार शीर्षलेख सेट करने के लिए संभव है? या क्या मुझे इस कार्यक्षमता के लिए रैक/परीक्षण का उपयोग करना होगा?

+0

भी संभावना है कि [wrap_parameters अभी भी भंडाफोड़] है (https://github.com/rails-api/rails-api/issues/33) रेल-एपीआई परियोजना के साथ और सामग्री प्रकार को सेट करने के साथ इसका कोई लेना-देना नहीं है। –

+0

पुष्टि की है कि wrap_parameters: url_encoded_form प्रारूप को विधि कॉल में जोड़कर काम करता है: 'wrap_parameters प्रारूप: [: url_encoded_form,: json] ' –

+0

आप rspec अनुरोध वातावरण के तत्वों को नियंत्रक में' request.env [' HTTP_CONTENT_TYPE '] के साथ सेट कर सकते हैं। = 'एप्लिकेशन/जेसन' या जो भी आपको चाहिए। – nmott

उत्तर

18

बहुत निराशा और विविधताएं और यही मेरे लिए काम करता है। रेल 3.2.12 Rspec 2,10

@request.env["HTTP_ACCEPT"] = "application/json" 
@request.env["CONTENT_TYPE"] = "application/json" 
put :update, :id => 1, "email" => "[email protected]" 

wrap_parameters कार्य इस तरह से

wrap_parameters User, format: :json 

User मॉडल

+1

यह वास्तव में मुझे ऊपर चला गया। 'Put: update,: id => 1,: format =>: json' ** ** ** काम नहीं करेगा। आपको VelLes के रूप में प्रवेश करना होगा। – maletor

5

यह मैं रेल 4.0.3 के लिए काम किया इस्तेमाल किया जा रहा घोषित किया जा रहा है और रुपेक 2.14.1 यदि कोई और नवीनतम संस्करण ढूंढ रहा है।

put '/projects/1.json', {name: 'Updated Project 1'}, { 
    'HTTP_ACCEPT' => 'application/json', 
    'CONTENT_TYPE' => 'application/json' 
} 

और

wrap_parameters Project, format: :json 
+1

मैंने पैरा के .to_json को हटा दिया और यह काम किया: 'put' /projects/1.json ', {name:' अपडेटेड प्रोजेक्ट 1 '}, { ' HTTP_ACCEPT '=>' एप्लिकेशन/जेसन ', ' CONTENT_TYPE '= > 'एप्लिकेशन/जेसन' } ' –

3

नई रेल v5.0.x मैंने पाया केवल सेटिंग्स एपीआई कि रेल "application/x-www-form-urlencoded" के लिए सब कुछ चूक के साथ इस समस्या RSpec-रेल के साथ परीक्षण

अनुरोध के लिए मुद्दा में अब भी है का उपयोग करना

./spec/support/json_requests.rb

पर समर्थन फ़ाइल बनाएँ:

यहाँ है कि मैं क्या समस्या को ठीक करने किया

module JsonRequests 
    def get(*args) 
    super(*json_args(*args)) 
    end 

    def post(*args) 
    super(*json_args(*args)) 
    end 

    def update(*args) 
    super(*json_args(*args)) 
    end 

    def patch(*args) 
    super(*json_args(*args)) 
    end 

    def put(*args) 
    super(*json_args(*args)) 
    end 

    def delete(*args) 
    super(*json_args(*args)) 
    end 

    def json_args(path, params = {}, headers = {}) 
    [path, params.to_json, headers.merge('CONTENT_TYPE' => 'application/json')] 
    end 
end 

RSpec.configure do |config| 
    config.include JsonRequests, type: :request 
end 

ध्यान रखें कि यह आपके "application/x-www-form-urlencoded" आप सका उपयोग करने की आवश्यकता है, इसलिए यदि ./spec/requests के भीतर सभी चश्मा को पार कर जाएगी: यह अपने एपीआई के सभी केवल JSON अनुरोधों के लिए व्यवहार को ओवरराइड करने के लिए कुछ इस तरह होना करने के लिए

संपादित करें include यह मॉड्यूल मैन्युअल रूप से आपके Describe 'something' do ब्लॉक में आवश्यक है।

0

यदि आप रेल 4 (और rspec ~ 3 का उपयोग कर रहे हैं।7) और इनलाइन सिंटैक्स का उपयोग नहीं करना चाहते हैं:

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