2011-10-06 3 views
9

私はCanCanを使用して自分のリソースを承認するためのレールプロジェクトに取り組んでいます。ユーザーがサインインしていないときに、AJAXフォームの提出を介して「トーク」を提出しようとすると、CanCanは{"status":"error","message":"You must be logged in to do that!"}という401を正しく生成します(私はfirebugを使ってブラウザでこれを確認しました)。RSpecを使用してCanCanの認証に失敗した応答コードをテストするにはどうすればよいですか?

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 

が成功した(割り当てです)、2番目はそうではありません:

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

あなたは 'post:create、:format =>:json'を読むように仕様を変更してみてください。 – zetetic

+0

提案をありがとう!残念ながら、私はまだ:format =>:jsonを追加した後、同じ302コードを取得します。 –

+1

テストログを見ましたか? – zetetic

答えて

8

私のプロジェクトでは、次の機能を持つCanCanからの許可例外が救済されました。リクエストがajax(そして別の方法でリダイレクト)されている場合にのみ関数が401を発生させるため、ブラウザで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 

感謝。

関連する問題