Im new to tdd and stubbing. When I stub a method im assumng that any code within that method does not get executed? Im trying to fake the method raising an exception but the results of my test indicate that the code in that method is being executed rather than bypassed.
can anyone help explain why?
My stubbing is
@logged_in_user.subscription.stubs(:stop_auto_renew).raises(:RuntimeError)
and in context
test "canceling subscription should handle exception raised by spreedly" do
login_larry_active
@logged_in_user.subscription.stubs(:stop_auto_renew).raises(:RuntimeError)
delete :destroy, {:user_id => @logged_in_user.id}
assert flash[:notice]
assert_redirected_to :controller => :dashboard, :action => :welcome
end
this is the method in my model im trying to stub. Spreedly::Subscriber normally fetches stuff from over the web.
class Subscription < ActiveRecord::Base
protected
def stop_auto_renew
Spreedly::Subscriber.find(self.user.id).stop_auto_renew()
end
end
-
class SubscriptionsController < ApplicationController
def destroy
user = User.find(params[:user_id])
if user
begin
user.subscription.stop_auto_renew
rescue RuntimeError
#log something and email admin
ldb("Spreedly cant process stop_auto_renew for user id: #{user.id}")
#email admin
end
flash[:notice] = "You have successfully cancelled your subscription and will take effect at the end of your current billing month"
end
redirect_to :controller => :dashboard, :action => :welcome
end
end
and the test error is
4) Error:
test_canceling_subscription_should_handle_exception_raised_by_spreedly(SubscriptionsControllerTest):
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.stop_auto_renew
app/models/subscription.rb:18:in `stop_auto_renew'
app/controllers/subscriptions_controller.rb:31:in `destroy'
/test/functional/subscriptions_controller_test.rb:42:in `test_canceling_subscription_should_handle_exception_raised_by_spreedly'