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

Anthony Carlos anthony at digitalphenom.com
Mon Jun 4 00:10:06 EDT 2007


David:

I could have had a V8?!?!

(For the young, that's a reference to the commercial for V8 fruit and  
vegetable juice where the actor slaps himself in the forehead wishing  
he drank the delicious and nutritious beverage instead of some other  
more stupid beverage choice).

Thanks for the unbelievably clear explanation. I will comment on your  
blog.

-Anthony

On Jun 3, 2007, at 3:55 PM, David Chelimsky wrote:

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



More information about the rspec-users mailing list