2016-04-23 100 views
0

我正在尝试学习MiniTest并通过这样做,我已经开始测试使用PayPal API批准/拒绝信用卡付款的应用程序之一。以下是我在测试Payment类中的购买方法的尝试。 (CREDIT_CARD原本是一个私有方法,转移到公众进行测试)MiniTest ::对于应该返回true的测试返回false的断言

payment.rb

require "active_merchant/billing/rails" 

class Payment < ActiveRecord::Base 
    belongs_to :order 
    attr_accessor :card_number, :card_verification 

    def purchase(card_info, billing_info) 
    if credit_card(card_info).valid? 
     response = GATEWAY.purchase(price_in_cents, credit_card(card_info), purchase_options(billing_info)) 
     @paypal_error = response.message 
     response.success? 
    end 
    end 

    def price_in_cents 
    (@total.to_f * 100).round 
    end 


    def credit_card(card_info) 
     @credit_card ||= ActiveMerchant::Billing::CreditCard.new(card_info) 
    end 

    private 

    def purchase_options(billing_info) 
    billing_info 
    end 

end 

payment_test.rb

require 'test_helper' 
require "active_merchant/billing/rails" 

class PaymentTest < ActiveSupport::TestCase 
    setup do 
    @card_info = { 
     brand: "Visa", 
     number: "4012888888881881", 
     verification_value: "123", 
     month: "01", 
     year: "2019", 
     first_name: "Christopher", 
     last_name: "Pelnar", 
    } 
    @purchase = Payment.new 
    end 

    test "purchase" do 
    assert @purchase.credit_card(@card_info).valid?, true 
    end 

end 

错误信息运行rake test后:

-------------------------- 
PaymentTest: test_purchase 
-------------------------- 
    (0.1ms) ROLLBACK 
    test_purchase             FAIL (0.02s) 
Minitest::Assertion:   true 
     test/models/payment_test.rb:20:in `block in <class:PaymentTest>' 


Finished in 0.03275s 
1 tests, 1 assertions, 1 failures, 0 errors, 0 skips 

回答

3

MiniTest::Assertionsassert方法调用使用语法assert(test, msg = nil)您的测试返回true的原因是您选择使用的消息。 assert_equal方法需要2个值进行比较。此外,而不是使私有方法公开,您可以使用.send方法是这样的:

assert @purchase.send(:credit_card,@card_info).valid? 

还可以更改设置的函数定义:

def setup 
    # setup logic 
end 

,使输出更冗长(捕捉ActiveMerchant错误),请尝试以下操作:

test "purchase" do 
    credit_card = @purchase.send(:credit_card, @card_info) 
    assert credit_card.valid?, "valid credit card" 
    puts credit_card.errors unless credit_card.errors.empty? 
end 

阅读rubyforge API我认为信用卡类型应设置为测试伪造的。

+0

我改变了方法回到私人和运行测试与你提供的逻辑,这就是它返回的:Minitest :: Assertion:断言失败,没有给出的消息。 – Ctpelnar1988

+0

感谢您纠正我的私人方法测试问题btw 。我一直在努力尝试它的语法。 – Ctpelnar1988

+1

您是否更改设置进入def设置? –

相关问题