Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RunTimeError: ActionController::RackDelegation in rspec 2.10.1 for rails 3.1.4 application controller

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.

like image 236
user938363 Avatar asked Jun 12 '12 01:06

user938363


2 Answers

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
like image 87
tfwright Avatar answered Oct 06 '22 00:10

tfwright


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
like image 43
Rustam A. Gasanov Avatar answered Oct 06 '22 00:10

Rustam A. Gasanov