Stubbing before_filters with RSpec and stub!

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.

Thanks in advance,

Joe


rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

On Jun 12, 2010, at 9:05 AM, Stephen S.stone wrote:


end
User.stub_chain(:where, :first).and_return(@user)
If I have stubbed load_user, should it just always return @user, no
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