2011-09-03 11 views
15

मैं थोड़ा स्टंप हूं। मैं निम्नलिखित एकीकरण परीक्षण है:रुपये और आरएसी के साथ आरईएसटी-एपीआई प्रतिक्रियाओं का परीक्षण :: टेस्ट

require "spec_helper" 

describe "/foods", :type => :api do 
    include Rack::Test::Methods 

    let(:current_user) { create_user! } 
    let(:host) { "http://www.example.com" } 

    before do 
    login(current_user) 
    @food = FactoryGirl.create_list(:food, 10, :user => current_user) 
    end 

    context "viewing all foods owned by user" do 

    it "as JSON" do 
     get "/foods", :format => :json 

     foods_json = current_user.foods.to_json 
     last_response.body.should eql(foods_json) 
     last_response.status.should eql(200) 

     foods = JSON.parse(response.body) 

     foods.any? do |f| 
     f["food"]["user_id"] == current_user.id 
     end.should be_true 

     foods.any? do |f| 
     f["food"]["user_id"] != current_user.id 
     end.should be_false 
    end 

    end 

    context "creating a food item" do 

    it "returns successful JSON" do 
     food_item = FactoryGirl.create(:food, :user => current_user) 

     post "/foods.json", :food => food_item 

     food = current_user.foods.find_by_id(food_item["id"]) 
     route = "#{host}/foods/#{food.id}" 

     last_response.status.should eql(201) 
     last_response.headers["Location"].should eql(route) 
     last_response.body.should eql(food.to_json) 
    end 

    end 

end 

मैं आवश्यक रैक जोड़ दिया है :: टेस्ट :: तरीके मुझे last_response विधि प्राप्त करने के लिए, लेकिन यह सही काम करने के लिए प्रतीत नहीं होता। last_response हमेशा मेरे पेज sign_in दिखाने के लिए भले ही मैं पहले से ही प्रवेश होने के बाद लगता है।

अगर मैं रैक :: टेस्ट :: तरीके को दूर last_response दूर चला जाता है और मैं response बजाय उपयोग कर सकते हैं और मैं वर्तमान प्रतिक्रिया मिल। सब कुछ ठीक काम करता प्रतीत होता है।

यह क्यों है? response विधि कहां से आ रही है? क्या मैं सत्र से पिछली प्रतिक्रिया प्राप्त करने के लिए response का उपयोग कर सकता हूं?

मैं इतना है कि मैं मार्गों मिलान कर सकते हैं के लिए

last_response.headers["Location"].should eql(route) 

last_response, या कुछ इसी तरह, उपयोग करने के लिए की जरूरत है। अगर यह इसके लिए नहीं था तो मैं सेट कर दूंगा।

+1

'login' के लिए कोड क्या है - क्या यह एक आरएसपीईसी परिभाषित विधि है या आपने इसे कहीं और परिभाषित किया है? क्या लॉगिन पेज को रीडायरेक्ट को काम करने की आवश्यकता होती है? यदि ऐसा है तो लॉगिन कोड के बाद 'follow_redirect! 'डालें। – iain

+0

आप किस समाधान के साथ आए हैं? मैं [टिकटी] (https://github.com/rails3book/ticketee) उदाहरण के साथ भी काम करता हूं लेकिन फिर भी 'last_response' में मुझे अपेक्षित प्रतिक्रिया नहीं है? इसके अलावा, उत्तरों में से एक को चिह्नित करना न भूलें। – JJD

उत्तर

1

response कुछ विशिष्ट प्रकार के लिए स्वचालित है।

रुपये शायद :type => :api ब्लॉक के लिए मिश्रित करता है।
responseActionController::TestCase::Behavior से आएगा, क्योंकि यह :type => :controller ब्लॉक के लिए करता है।

यदि आप response द्वारा दिए गए पहले प्रतिक्रिया प्राप्त करना चाहते हैं, तो अगला अनुरोध करने से पहले इसे एक चर में संग्रहीत करने का प्रयास करें।

https://www.relishapp.com/rspec/rspec-rails/v/2-3/docs/controller-specs और https://github.com/rspec/rspec-rails कुछ विभिन्न प्रकार के प्रकारों के साथ मिश्रित होने के बारे में कुछ जानकारी दें।

+1

मेरे पास एक ही समस्या थी, जब मैं उन्हें एपीसी चश्मे को एक अलग फ़ोल्डर में ले जाता था, तो मुझे अपने चश्मा काम नहीं कर रहे थे, जब मुझे यह त्रुटि नहीं मिली – shicholas

0

मुझे लगता है कि login(current_user) रैक :: टेस्ट :: विधियों के साथ काम नहीं करता है। आपको अपने एपीआई कॉल के माध्यम से प्रमाणीकरण करने का एक तरीका चाहिए, शायद प्रमाणीकरण टोकन के साथ।

response एक्शनकंट्रोलर से जुड़ा हुआ है, जो आपके लॉगिन के बारे में जानता है। अगर मुझे गलत नहीं लगता है, तो एपीआई कॉल नियंत्रक से स्वतंत्र हैं, इसलिए यह नहीं पता कि आप पहले ही लॉग इन हैं।

Ticketee देखें, उदाहरण के लिए Rails 3 in Action से उदाहरण ऐप देखें!

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