2011-09-10 17 views
0

rspecでコントローラのスタブ認証を試みています。 authorizeメソッドをスタブすると、私が提供する値が何であってもテストは常に成功しました。RSpecを使用したApplicationControllerメソッドのスタブ

コントローラー:

class FoosController < ApplicationController 
    before_filter :authorize 
    ... 
end 

ApplicationControllerに:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    helper_method :current_user 

    protected 

    def authorize 
    return true if current_user 

    flash[:error] = 'Please login' 
    redirect_to signin_path 
    false 
    end 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 
end 

仕様:

# this passes (expected) 
it "..." do 
    controller.stubs(:current_user).returns(User.new) 
    get :index 
    response.should be_success 
end 

# this fails (expected) 
it "..." do 
    controller.stubs(:current_user).returns(nil) 
    get :index 
    response.should be_success 
end 

# this passes (expected) 
it "..." do 
    controller.stubs(:authorize).returns(true) 
    get :index 
    response.should be_success 
end 

# Problem: this passes (unexpected) 
it "..." do 
    controller.stubs(:authorize).returns(false) 
    get :index 
    response.should be_success 
end 

それは、すぐに私はスタブとしてのように思える:関係なく、それを設定されているどのような値、許可しません必ずbefore_filterを渡します。私は保護された/ helper_methodの指定かもしれないと思ったが、それらと遊ぶことは何も変わらなかった。

なぜスタブしますか?before_filterを渡す理由はfalseですか?

答えて

2

何がレンダリングされているかを確認する必要があると思います。

コードを見ると、authorizeがfalseを返したときにコールチェーンが実際に停止した場合、 はどうなるでしょうか?

リダイレクトやレンダリングコールはありません。

これは空の応答ですか?

空の応答はまだbefore_filter戻っfalseはもはや連鎖を止めるのRails 3.1でその可能性が200

、あなたが使っているのRailsのバージョンによっては、だろう。

本当に、連鎖を止めたいbefore_filterはどこか

    1. リダイレクトのいずれかを実行し、私はあなたの最後にお答えします
    2. レイズ何か
  • +0

    OKです。私はちょうど許可し、ブラウザを読み込み、リダイレクトが呼び出されないので、私は200とページを取得するfalseを返す。ヘルプありがとう。 – blu

    0

    何かをレンダリングする必要があります質問Why does stubbing :authorize with false cause the before_filter to pass?

    あなたはスタブしています彼はmethod authorizeを呼び出します。これは文字通りその中のすべてのコードが呼び出されるのを止めますが、あなたが明示的にスタブで返すものを返します。

    current_userからfalseにスタブすると、authorizeが完全に呼び出されるため、正常に動作しています。私はあなたの最後のテストは実際にあなたのために何かをテストしていないと思うが、それはちょうど私の意見です。

    関連する問題