9

Rails 3.1.4 アプリでは、アプリケーション コントローラーrspecのパブリック メソッドをテストするために使用されます。require_signinメソッドrequire_signinは次のとおりです。

  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コードのどこが間違っている可能性がありますか? 本当にありがとう。

4

3 に答える 3

4

このエラーに遭遇し、テストしたいヘルパー メソッドを呼び出してコントローラーでリダイレクトをトリガーしていることに気付きましたが、実際にはまだテスト リクエストをインスタンス化していませんでした。期待値を呼び出す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
于 2013-06-17T19:22:10.227 に答える
1

アクションの仕組みを確認したい場合は、このような呼び出しのshould_receive前に使用する必要がありますsend

it "should redirect to signin_path" do
  controller.should_receive(:redirect_to).with(signin_path)
  controller.send(:require_signin) 
end
于 2013-10-07T11:02:35.790 に答える
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."}

:confirmableDevise にオプションを追加したばかりで、サインインしようとして作成したすべてのユーザーが未確認であり、正常にログインできないことに気付きました。confirmed_at Time.nowファクトリー/フィクスチャーの作成にユーザーを追加する必要がありました。ただし、あなたの例では、ログインしていないときにテストしようとしているように見えるので、これが必ずしも当てはまるかどうかはわかりません。

于 2012-09-10T22:11:13.217 に答える