2011-10-06 5 views
9

मैं एक रेल परियोजना पर काम कर रहा हूं जिसमें मैं अपने संसाधनों को अधिकृत करने के लिए कैनकन का उपयोग करता हूं। जब कोई उपयोगकर्ता साइन इन नहीं होता है और "टॉक" सबमिट करने का प्रयास करता है (एजेक्स फॉर्म सबमिशन के माध्यम से), कैनकन प्रतिक्रिया के रूप में {"status":"error","message":"You must be logged in to do that!"} के साथ सही ढंग से 401 उठाता है (मैंने फ़ायरबग का उपयोग करके ब्राउज़र में इसे सत्यापित किया है)।कैनकन विफलता प्राधिकरण पर प्रतिक्रिया कोड का परीक्षण करने के लिए मैं आरएसपीसी का उपयोग कैसे कर सकता हूं?

class TalksController < ApplicationController 
    authorize_resource 

    def create 
    @talk = current_user.talks.build(params[:talk]) 

    respond_to do |format| 
     if @talk.save 
     response = { :redirect => talk_path(@talk) } 
     format.html { redirect_to @talk, notice: 'Talk was successfully created.' } 
     format.json { render json: response, status: :created, } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @talk.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
end 

talks_controller_spec.rb: लेकिन, मेरा परीक्षण में एक 401 के बजाय एक 302 प्रतिक्रिया कोड प्राप्त [: बात] सौंपा नहीं प्राप्त करता है

describe TalksController do 
    describe "POST create" do 
    context "when not signed in" do 
     it "should not assign talk" do 
     post :create 
     assigns[:talk].should be_nil 
     end 
     it "should respond with a 401" do 
     post :create 
     response.response_code.should == 401 
     end 
    end 
    end 
end 

पहला उदाहरण यहाँ शामिल सफल (असाइन करता है), लेकिन दूसरा नहीं है:

1) TalksController POST create when not signed in should respond with a 401 
    Failure/Error: response.response_code.should == 401 
     expected: 401 
      got: 302 (using ==) 
    # ./spec/controllers/talks_controller_spec.rb:53:in `block (4 levels) in <top (required)>' 

मुझे यकीन नहीं है कि वास्तव में क्या हो रहा है। क्या ब्राउज़र में लौटाए गए वास्तविक प्रतिक्रिया कोड के लिए मैं परीक्षण कर सकता हूं? या एक बेहतर तरीका मैं प्राधिकरण का परीक्षण कर सकते हैं?

+0

आप 'पोस्ट: बनाने, प्रारूप =>: जेसन' पढ़ने के लिए spec को बदलने का प्रयास कर सकते हैं और देख सकते हैं कि इससे मदद मिलती है या नहीं। – zetetic

+0

सुझाव के लिए धन्यवाद! दुर्भाग्यवश, मुझे अभी भी जोड़ने के बाद एक ही 302 कोड मिलता है: प्रारूप =>: जेसन। –

+1

क्या आपने परीक्षण लॉग देखा है? – zetetic

उत्तर

8

जैसा कि यह निकला, मेरी परियोजना ने निम्नलिखित कार्य के साथ कैनकन से प्राधिकरण अपवादों को बचाया। क्योंकि फ़ंक्शन केवल 401 उठाता है जब अनुरोध AJAX (और अन्यथा रीडायरेक्ट करता है), मुझे ब्राउज़र में 401 मिल रहा था, लेकिन मेरे परीक्षण नहीं। मैं अपने परीक्षण लॉग की जांच, के रूप में इस अनुरोध में अंतर का पता चला सुझाव देने के लिए zetetic को

# Handle authorization exceptions 
rescue_from CanCan::AccessDenied do |exception| 
    if request.xhr? 
    if signed_in? 
     render json: {:status => :error, :message => "You don't have permission to #{exception.action} #{exception.subject.class.to_s.pluralize}"}, :status => 403 
    else 
     render json: {:status => :error, :message => "You must be logged in to do that!"}, :status => 401 
    end 
    else 
    render :file => "public/401.html", :status => :unauthorized 
    end 
end 

धन्यवाद।