1

いくつかの日付を比較するテストを書こうとしています。これまでのところ、2つのテストがあり、そのうちの1つは意図したとおりに機能しますが、日付を正しく比較しない/正しく比較しないため、もう1つは失敗します。これが私のコードです:

def self.has_expired?(card, start_month, start_year, annually)
    card_date = Date.new(card.year, card.month, -1)
    billing_date = Date.new(start_year, start_month, -1)
    if !annually
      p '--------'
      p card_date
      p billing_date
      card_date > billing_date

    else
      #return false
    end
  end

クレジットカードオブジェクト

creditcard = ActiveMerchant::Billing::CreditCard.new(
        :number     => 1234567890123456
        :month      => 01,
        :year       => 13,
        :first_name => 'John', 
        :last_name  => 'Doe',
        :verification_value  => 132,
        :brand => 'visa'
      )

これがpの出力です。最初のブロックは意図したとおりに機能します。

"--------"
Tue, 31 Jan 0013
Thu, 28 Feb 2013
false

2番目のブロックは失敗し、trueを期待しますが、falseになります

."--------"
Tue, 31 Jan 0013
Fri, 30 Nov 2012
false

これが私のrspecコードです

describe CreditCard do 
  context 'card_expired' do
    it 'should return false with args passed to method (02month, 13 year, annually==false)' do
      CreditCard.has_expired?(creditcard, 02, 2013, false).should == false
    end

    it 'should return true with args passed to method (11month, 12 year, annually==false)' do
      CreditCard.has_expired?(creditcard, 11, 2012, false).should == true
    end
  end

end

irbでは、チャームとして機能し、正しい値(true / false)を返します。

4

1 に答える 1

2

問題はあなたの論理にあると思います。有効期限が請求日より前の場合、カードは期限切れになります。

card_date < billing_date # expired

いつではなく

card_date > billing_date # valid

また、2013年全体を入れてみて、それが壊れ続けるかどうかを確認してください

:year => 2013,

この行の後にコンマもありません (おそらくコピー/貼り付けエラー):number => 1234567890123456

于 2013-01-02T11:56:29.647 に答える