[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