RunTimeError: ActionController::RackDelegation in

2019-02-06 22:44发布

In our rails 3.1.4 app, rspec is used to test the public method require_signin in application controller. Here is the method require_signin:

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

Here is the rspec code:

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

The above rspec generates gigantic multi pages error starting like the below:

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>, ........

What could be wrong with the rspec code? Thanks so much.

3条回答
祖国的老花朵
2楼-- · 2019-02-06 23:33

Might not be entirely useful, but I came here after getting the same error. I started with a passing test suite, made some changes, and then started getting errors like:

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

After taking a closer look at the error, I noticed that it said somewhere:

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

I had just added the :confirmable option in Devise, and realized that all users that I created that I was trying to sign in as were unconfirmed, and as such could not successfully log in. I needed to add confirmed_at Time.now to my factory/fixture creation for users. In your example though, it seems like you are trying to test when not logged in, so I'm not sure this is necessarily applicable.

查看更多
Deceive 欺骗
3楼-- · 2019-02-06 23:40

I came across this errror and realized I was triggering a redirect on the controller by calling a helper method I wanted to test, but I hadn't actually instantiated a test request yet. Calling get :index before calling the expectation got rid of the error.

it "redirects if some condition" do
  subject.send(:helper_method)
  get :action # <= Need this before setting expectation below
  response.should redirect_to("/somewhere")
end
查看更多
别忘想泡老子
4楼-- · 2019-02-06 23:42

If you want to check action mechanics, you should use should_receive before a send call like this

it "should redirect to signin_path" do
  controller.should_receive(:redirect_to).with(signin_path)
  controller.send(:require_signin) 
end
查看更多
登录 后发表回答