mocha 是否在存根(Rails)中运行代码?

发布于 2024-08-14 03:38:27 字数 2062 浏览 1 评论 0原文

我对 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::订阅者通常从网络上获取内容。

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'

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'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

左岸枫 2024-08-21 03:38:27

我可能是错的,但我的猜测是您已经在对象 @logged_in_user.subscription 上存根了方法 :stop_auto_renew (我假设用户有订阅?),但随后调用实际上是在控制器中的 User.find(params[:user_id]) 创建的不同实例上进行的。

也许尝试 Subscription.any_instance.stubs(:stop_auto_renew)... 它应该存根订阅的所有实例。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文