【问题标题】:Testing association methods with Mocha使用 Mocha 测试关联方法
【发布时间】:2010-11-15 18:55:28
【问题描述】:

我有一个带有 Order 和 Refund 模型的 Rails 应用程序。订单 has_many :refunds。一切都很好。我正在尝试为控制器中的退款逻辑编写功能测试。这是我现在拥有的:

test "should not process partial paypal refund for partially refunded order when refund total plus refund amount is greater than order total" do
    set_super_admin_login_credentials
    o = Order.new
    o.stubs({:id => 1234567, :source => "PayPal", :total => 39.95, :user => users(:dave)})
    Order.stubs(:find).with(1234567).returns(o)
    get :refund, {:order_id => 1234567}
    assert_equal o, assigns(:order)
    o.refunds.build.stubs({:amount => 1.0})
    o.refunds.build.stubs({:amount => 30.00})
    assert_raise do
        post :refund, {:order_id => 1234567, :refund_amount => 10.00}
    end
end

而在控制器中,退款方法是这样的:

def refund    
    @order = Order.find(params[:order_id])
    return if request.get?

    amount = params[:refund_amount].to_f
    raise "Cannot refund order for more than total" if (@order.refunds.sum(&:amount) + amount)
    # Do refund stuff
end

一些注意事项:

  1. 我将 o.refunds.build 位基于 Ryan Bates' Railscast. 如果这不正确或不再相关,这是有用的信息。

  2. 我看到很多关于如何实际执行sum 方法的相互矛盾的信息,有些使用&,有些没有。在script/console 中,& 爆炸了,但没有它,我得到了一个实际的总和。但是,在我的控制器中,如果我从 &:amount 切换到 :amount,我会收到以下消息:NoMethodError: undefined method+' for :amount:Symbol`

我觉得缺少一些概念性信息而不是某个地方的错误,所以我会感谢一些指针。

【问题讨论】:

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


    【解决方案1】:

    终于解决了问题。我将一个空关联存根为[],而不是将它留给nil,让Rails 处理其他一些方法。所以,当我改变一个时,另一个会失败。智者的话:Enumerable#sumActiveRecord::Associations::AssociationCollection#sum 采用完全不同的参数。 :)

    因此,通过将存根更改为在 sum 中删除 :refunds => []using a string for the field name,我让事情恢复正常。所以,这是上面代码的功能版本:

    test "should not process partial paypal refund for partially refunded order when refund total plus refund amount is greater than order total" do
        set_super_admin_login_credentials
        o = Order.new
        o.stubs({:id => 1234567, :source => "PayPal", :total => 39.95, :user => users(:dave)})
        Order.stubs(:find).with(1234567).returns(o)
        get :refund, {:order_id => 1234567}
        assert_equal o, assigns(:order)
        o.refunds.build.stubs({:amount => 1.0})
        o.refunds.build.stubs({:amount => 30.00})
        assert_raise do
            post :refund, {:order_id => 1234567, :refund_amount => 10.00}
        end
    end
    
    def refund    
        @order = Order.find(params[:order_id])
        return if request.get?
    
        amount = params[:refund_amount].to_f
        raise "Cannot refund order for more than total" if (@order.refunds.sum('amount') + amount)
        # Do refund stuff
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2015-01-04
      • 2016-06-28
      • 2019-05-17
      相关资源
      最近更新 更多