On Jun 12, 2010, at 9:05 AM, Stephen Smithstone wrote:
> On 11/06/2010 03:07, Joseph DelCioppio wrote:
>>
>> Guys,
>>
>> I've got a private controller method which acts as a before_filter
>> that I'm trying to stub.
>>
>> class TasksController < ApplicationController
>> before_filter :load_user
>>
>> ......
>>
>> private
>>
>> def load_user
>> if current_user.id == params[:user_id].to_i
>> @user = current_user
>> else
>> flash[:notice] = "Sorry but you can't view other people's
>> tasks."
>> redirect_to root_path
>> end
>> end
>> end
>>
>>
>> describe TasksController do
>>
>> before(:each) do
>> @user = Factory(:user)
>> sign_in @user
>> @task = Factory(:task)
>> User.stub_chain(:where, :first).and_return(@user)
>> controller.stub!(:load_user).and_return(@user)
>> end
>>
>> .......
>> end
>>
>> However, even though I'm stubbing load_user, the actual function is
>> still being called, because I can make all my tests either pass/fail
>> if I simply have load_user neglect to return @user.
>>
>> If I have stubbed load_user, should it just always return @user, no
>> matter what I do to the actual controller method? I thought that this
>> was the point of stubbing, that way if I change load_user in the
>> future, only the tests specifically designed to exercise load_user
>> will fail, but the rest of my suite will still pass.
>>
>> I'm going to post my entire controller and spec and provide the Gist
>> links in case the abbreviated versions I gave aren't enough.
>>
>> http://gist.github.com/433942
> What I would do maybe not the best solution is to control what is returned in
> current user so if you want to test that the redirect works then
> make current_user return nil then the redirect should work and to get the
> filter to pass stub the current user to return an instance that has an id
> that matches the param passed in
That's actually a very common solution to this problem. The caller of the
filter doesn't actually store the user, it expects the filter to set the @user
instance variable.
Cheers,
David
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users