views:

285

answers:

1

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'
+3  A: 

I could be wrong but my guess is that you have stubbed the method :stop_auto_renew on the object @logged_in_user.subscription (I assume that user has a subscription?) but then the call is actually made on a different instance created from the User.find(params[:user_id]) in your controller.

Perhaps try Subscription.any_instance.stubs(:stop_auto_renew)... which should stub all the instances of a Subscription.

tsdbrown
your right. Im new to mocha and missed that important any_instance part despite it starting me right in the face in the docs. Thank you very much for your help!
adam
No problem just glad to help! Keep up with the TDD it does pay off lol.
tsdbrown