[rspec-users] Setting instance variables for controllers

Jonathan Linowes jonathan at parkerhill.com
Wed Sep 3 11:29:39 EDT 2008


On Sep 3, 2008, at 10:53 AM, Scott Taylor wrote:

>
> On Sep 3, 2008, at 10:40 AM, Maurício Linhares wrote:
>
>> You don't need to set the instance variable, you can stub the find  
>> call:
>
>
> Or you could also stub the call to User::find.
>
> Also - you don't *WANT* to set the instance variable - it's an  
> encapsulation violation - there is nothing in the public interface  
> about it.  Remember, these are not only specs, but *examples*.   
> Would you want someone writing production code modeled off of that  
> spec?
>
> Scott

Often I'll encapsulate important instance variables (especially ones  
assigned in before_filters) in a method, like current_user,  
current_project, etc.

     def current_project
         @project
     end

Then these are easily stubbed in specs.

	controller.stub!(:current_project).and_return(project)

Further, I usually mock the entire before_filter methods

	before_filter :find_project

with a shared method like

def mock_find_project
   project = @project || mock_project
   controller.stub!(:find_project).and_return(project)
   controller.stub!(:current_project).and_return(project)
   project
end

Lastly, I maintain the find_project method in application.rb so it  
can be shared among controllers, and tested separately. (either with  
shared behaviors, or in my case i've rigged up an  
application_controller_spec that lets me test methods in  
application.rb independent of a specific controller).

--linoj
	

> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users



More information about the rspec-users mailing list