MiniTest ::断言为测试返回false,应该返回true

时间:2016-04-23 13:36:26

标签: ruby-on-rails ruby minitest

我正在尝试学习MiniTest,通过这样做,我开始测试我的一个使用PayPal API批准/拒绝信用卡付款的应用程序。以下是我在Payment类中测试购买方法的尝试。 (credit_card最初是一种私人方法,移动到公众进行测试)

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

1 个答案:

答案 0 :(得分:3)

MiniTest::Assertions assert方法调用使用语法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我认为信用卡类型应该在测试中设置为伪造。