2

私はtddとスタブが初めてです。メソッドをスタブすると、そのメソッド内のコードが実行されないと仮定しますか? 例外を発生させるメソッドを偽造しようとしていますが、テストの結果は、そのメソッドのコードがバイパスされずに実行されていることを示しています。

誰でも理由を説明できますか?

私のスタビングは

@logged_in_user.subscription.stubs(:stop_auto_renew).raises(:RuntimeError)

そして文脈で

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

これは、スタブしようとしている私のモデルのメソッドです。Spreedly::Subscriber は通常、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

テストエラーは

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'
4

1 に答える 1

3

私は間違っている可能性がありますが:stop_auto_renew、オブジェクトのメソッドをスタブ化したと思います@logged_in_user.subscription(ユーザーがサブスクリプションを持っていると思いますか?) が、実際にはコントローラーで作成された別のインスタンスで呼び出しが行われUser.find(params[:user_id])ます。

おそらくSubscription.any_instance.stubs(:stop_auto_renew)...、サブスクリプションのすべてのインスタンスをスタブする必要があるか試してみてください。

于 2009-12-09T20:49:30.433 に答える