2016-04-23 1 views
0

Ich versuche, MiniTest zu lernen, und damit habe ich begonnen, eine meiner Anwendungen zu testen, die die PayPal-API zu dem Genehmigen/dem Ablehnen von Kreditkartenzahlungen verwendet. Unten ist mein Versuch, die Kaufmethode in der Payment-Klasse zu testen. (CREDIT_CARD war ursprünglich eine private Methode, bewegt für die Prüfung von öffentlichen)MiniTest :: Behauptungen, die für den Test, der True zurückgeben sollte, falsch sind

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 

Fehlermeldung nach rake test ausgeführt wird:

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

Antwort

3

MiniTest::Assertionsassert Methodenaufruf verwendet die Syntax assert(test, msg = nil) Der Grund, dass Ihr Test True zurückgibt, ist die Nachricht, die Sie verwenden möchten. Die assert_equal Methode benötigt 2 Werte zum Vergleich. Auch statt der privaten Methode öffentlich zu machen, können Sie die .send Methode wie folgt verwenden:

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

Auch das Setup zu einer Funktionsdefinition ändern:

def setup 
    # setup logic 
end 

Um die Ausgabe ausführlicher zu machen (fangen die ActiveMerchant Fehler), versuchen Sie folgendes:

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 Lesen ich denke, die Kreditkartentyp sollte bei der Prüfung auf gefälschte eingestellt werden.

+0

Ich änderte die Methode zurück in private und führte den Test mit der Logik, die Sie zur Verfügung gestellt, das ist, was es zurückgegeben: Minitest :: Assertion: Failed Assertion, keine Nachricht gegeben. – Ctpelnar1988

+0

Vielen Dank für die Korrektur meiner privaten Testmethode Problem btw . Ich hatte mit der Syntax dafür gekämpft, es vorher zu versuchen. – Ctpelnar1988

+1

Haben Sie das Setup in die Def-Konfiguration geändert? –

Verwandte Themen