2012-06-12 12 views
8

レール3.1.4のアプリケーションでは、rspecを使用してアプリケーションコントローラのパブリックメソッドrequire_signinをテストします。ここでは、メソッドrequire_signinは次のとおりです。ここでRunTimeError:rspecのActionController :: RackDelegation 2.10.1のレール3.1.4のアプリケーションコントローラ

def require_signin 
    if !signed_in? 
     flash.now.alert = "Log in first!" 
     redirect_to signin_path 
    end 
    end 

rspecコードは次のとおりです。

it "should invoke require_signin for those without login" do 
    controller.send(:require_signin) 
    controller {should redirect_to signin_path} 
end 

上記rspecは巨大なマルチページは以下のように起動エラー発生:

RuntimeError:←[0m 
     ←[31mActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil: #<ApplicationController:0x3 
a67f10 @_routes=nil, @_action_has_layout=true, @_view_context_class=nil, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_reques 
t=#<ActionController::TestRequest:0x3a68720 @env={"rack.version"=>[1, 1], "rack.input"=>#<StringIO:0x34fad60>, ........ 

間違っている可能性がどのようなrspecコードを使用していますか?本当にありがとう。

+0

ようsend呼び出しの前should_receiveを使用する必要がありますしてください。私もこの答えが必要です – tekknolagi

答えて

0

完全には役に立たないかもしれませんが、同じエラーが発生した後にここに来ました。私は、通過テストスイートを始め、いくつかの変更を加え、その後のようなエラー入門:エラーを詳しく見て取った後

RuntimeError: 
    ActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil: 
    ...many lines... 

を、私はそれがどこかで言っていることに気づいた:

@flashes={:alert=>"You have to confirm your account before continuing."} 

I Deviseに:confirmableオプションを追加しました。私が作成しようとしていたすべてのユーザーが未確認でログインできなかったことに気付きました。ユーザーの工場/什器作成にconfirmed_at Time.nowを追加する必要がありました。あなたの例では、ログインしていないときにテストしようとしているようですので、これが必ず適用可能かどうかはわかりません。

3

このエラーが発生し、私がテストしたいヘルパーメソッドを呼び出すことでコントローラのリダイレクトをトリガーしていたことがわかりましたが、まだ実際にテストリクエストをインスタンス化していませんでした。予想を呼び出す前にget :indexを呼び出すと、エラーが取り除かれました。あなたは、アクションの仕組みを確認したい場合は

it "redirects if some condition" do 
    subject.send(:helper_method) 
    get :action # <= Need this before setting expectation below 
    response.should redirect_to("/somewhere") 
end 
+0

未来からおかげで!これで私の問題が修正されました。 – taylorthurlow

0

、あなたは恵みを追加この

it "should redirect to signin_path" do 
    controller.should_receive(:redirect_to).with(signin_path) 
    controller.send(:require_signin) 
end 
関連する問題