【发布时间】: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
一些注意事项:
我将
o.refunds.build位基于 Ryan Bates' Railscast. 如果这不正确或不再相关,这是有用的信息。我看到很多关于如何实际执行
sum方法的相互矛盾的信息,有些使用&,有些没有。在script/console中,&爆炸了,但没有它,我得到了一个实际的总和。但是,在我的控制器中,如果我从&:amount切换到:amount,我会收到以下消息:NoMethodError: undefined method+' for :amount:Symbol`
我觉得缺少一些概念性信息而不是某个地方的错误,所以我会感谢一些指针。
【问题讨论】:
标签: ruby-on-rails associations mocha.js