Unable to stub helper method with rspec
rspec, rspec-rails, rspec2, ruby-on-rails, ruby-on-rails-3
Solution
Try this, it worked for me:
describe SomeHelper
before :each do
@helper = Object.new.extend SomeHelper
end
it "why cant i stub a helper method?!" do
@helper.stub!(:current_user).and_return(@user)
# ...
end
end
The first part is based on this reply by the author of RSpec, and the second part is based on this Stack Overflow answer.
Problem
I am trying to stub a method on a helper that is defined in my controller. For example: ``` class ApplicationController < ActionController::Base def current_user @current_user ||= authenticated_user_method end helper_method :current_user end module SomeHelper def do_something current_user.call_a_method end end ``` In my Rspec: ``` describe SomeHelper it "why cant i stub a helper method?!" do helper.stub!(:current_user).and_return(@user) helper.respond_to?(:current_user).should be_true # Fails helper.do_something # Fails 'no method current_user' end end ``` In `spec/support/authentication.rb` ``` module RspecAuthentication def sign_in(user) controller.stub!(:current_user).and_return(user) controller.stub!(:authenticate!).and_return(true) helper.stub(:current_user).and_return(user) if respond_to?(:helper) end end RSpec.configure do |config| config.include RspecAuthentication, :type => :controller config.include RspecAuthentication, :type => :view config.include RspecAuthentication, :type => :helper end ``` I asked a similar question here, but settled on a work around. This strange behavior has creeped up again and I would like to understand why this doesnt work. UPDATE: I have found that calling `controller.stub!(:current_user).and_return(@user)` before `helper.stub!(...)` is what is causing this behavior. This is easy enough to fix in `spec/support/authentication.rb`, but is this a bug in Rspec? I dont see why it would be expected to not be able to stub a method on a helper if it was already stubbed on a controller.