【问题标题】:Does mocha run the code in a stub (Rails)?mocha 是否在存根(Rails)中运行代码?
【发布时间】:2010-12-24 09:49:20
【问题描述】:

我是 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 通常从网络上获取内容。

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'

【问题讨论】:

    标签: ruby-on-rails stub mocha.js


    【解决方案1】:

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

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

    【讨论】:

    • 你的权利。我是 mocha 的新手,并且错过了重要的 any_instance 部分,尽管它让我在文档中直接面对。非常感谢您的帮助!
    • 没问题,很高兴为您提供帮助!跟上 TDD,它确实有回报。
    猜你喜欢
    • 2010-12-23
    • 2021-06-30
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2015-05-24
    相关资源
    最近更新 更多