2010-11-15 3 views
1

J'ai une application Rails avec un modèle Order and Refund. Commande has_many: remboursements. Tout va bien. J'essaye d'écrire un test fonctionnel pour la logique de remboursement dans un contrôleur. Voici ce que j'ai en ce moment:Test des méthodes d'association avec Mocha

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 

Et dans le contrôleur, la méthode de remboursement ressemble à ceci:

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 

Quelques notes:

  1. Je fonde le bit o.refunds.build sur Ryan Bates' Railscast. Si ce n'est pas correct ou n'est plus pertinent, c'est une information utile.

  2. J'ai vu beaucoup d'informations contradictoires sur la façon de réellement faire la méthode sum, certaines avec le & et d'autres sans. Dans script/console, le & explose mais sans lui, je reçois une somme réelle. Dans mon contrôleur, cependant, si je passe &:amount-:amount, je reçois ce message: NoMethodError: undefined method + » pour: Montant: Symbol`

je me sens comme il y a des informations conceptuelles manquantes plutôt que d'un bug quelque part, alors J'apprécierai quelques pointeurs.

Répondre

1

Enfin compris le problème. Je cédais une association vide comme [] plutôt que de lui laisser nil pour que Rails puisse gérer d'autres méthodes. Donc, quand je changerais l'un, l'autre échouerait. Word à la sagesse: Enumerable#sum et ActiveRecord::Associations::AssociationCollection#sum prennent des paramètres entièrement différents. :)

Donc, en changeant les bouchons pour laisser :refunds => [] et using a string for the field name dans sum J'ai ramené les choses à la normale. Donc, voici la version fonctionnelle du code ci-dessus:

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 
Questions connexes