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

David Chelimsky dchelimsky at gmail.com
Sun Jun 3 15:55:50 EDT 2007


On 6/1/07, Anthony Carlos <anthony at digitalphenom.com> wrote:
>
> 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?

This question inspired me to write this blog post:

http://blog.davidchelimsky.net/articles/2007/06/03/oxymoron-testing-behaviour-of-abstractions

Feel free to comment directly on the blog.

Cheers,
David

> 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
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list