[rspec-users] Specs for ApplicationController, where to put them?

Anthony Carlos anthony at digitalphenom.com
Fri Jun 1 18:20:32 EDT 2007


On May 29, 2007, at 7:52 PM, David Chelimsky wrote:

>> My problem now, is that I get a nil object error. Specifically, in
>> application.rb, I'm trying to call request.parameters and request is
>> nil. It seems that request is not part of the context anymore since I
>> moved the behavior out to a separate file. How do I regain access to
>> request, response, assigns, flash, and session?
>
> The fact that the shared examples are in another file should have no
> bearing on whether they have runtime access to whatever is in the
> behaviours that include them. This all sounds odd to me. Can you post
> a backtrace please?

David:

Here's the output from rake spec:autotest:

:
QuestionnairesController
- should flash notice when session[:current_user_id] does not exist  
(ERROR - 1)
- should return true when session[:current_user_id] exists
- should respond to current_user
- should respond to authenticate

1)
NoMethodError in 'QuestionnairesController should flash notice when  
session[:current_user_id] does not exist'
You have a nil object when you didn't expect it!
The error occurred while evaluating nil.parameters
/Users/aec/ror/aca/aca_trunk/config/../app/controllers/application.rb: 
11:in `authenticate'
./spec/controllers/application_controller_spec.rb:24:

=====
Here's application_controller_spec.rb:
require File.dirname(__FILE__) + '/../spec_helper'

unless Spec::DSL::Behaviour.find_shared_behaviour("All controllers")
   describe "All controllers", :shared => true do
     it "should respond to authenticate" do
       controller.should respond_to(:authenticate)
     end
     it "should respond to current_user" do
       controller.should respond_to(:current_user)
     end
     it "should return true when session[:current_user_id] exists" do
       session[:current_user_id] = 12345
       controller.authenticate.should == true
     end
     it "should flash notice when session[:current_user_id] does not  
exist" do
       session[:current_user_id] = nil
       controller.authenticate # <=====  This is line 24 where the  
error occurs!
       flash[:notice].should == 'Please login.'
     end
   end
end

=====
Here's application.rb:
class ApplicationController < ActionController::Base
   # Pick a unique cookie name to distinguish our session data from  
others'
   session :session_key => '_unique_session_id'

   def authenticate
     unless session[:current_user_id]
       flash[:notice] = 'Please login.'
       session[:jumpto] = request.parameters # <===== This is line 11  
where nil.parameters is called!
       redirect_to(:controller => 'ums', :action => 'login')
     end
     true
   end

   def current_user
     @current_user = User.find(session[:current_user_id])
   end
end

=====
Finally, here's questionnaires_controller_spec.rb:
require File.dirname(__FILE__) + '/../spec_helper'
require File.dirname(__FILE__) + '/application_controller_spec'  
unless Spec::DSL::Behaviour.find_shared_behaviour("All controllers")

describe QuestionnairesController do
   it_should_behave_like "All controllers"
end
:

=====
So as far as I can tell, my QuestionnairesController should behave  
like "All controllers" which puts us at  
application_controller_spec.rb. The first 3 examples pass, but the  
fourth, which calls ApplicationController.authenticate, gives me the  
nil object. But, isn't request an object that is always available to  
controllers?

Wait a second...

There's no get or post command here! Maybe thats why request is nil?  
I think so. Never mind! Sorry about the false alarm. I don't want to  
be the boy who cried wolf.

On the other hand, I think I avoided using get or post because this  
is an abstract action that gets called by other concrete classes. So  
how does one test logic in an abstract class? Smells like a job for a  
mock, of course?!? I'll look over the list archive-- I think other  
people have asked this question before.

Thanks for helping out the slow learners,

-Anthony


More information about the rspec-users mailing list