2017-09-04 9 views
0

前モデルのセッターを使用したとき、私は、ユーザーがset_totalこのshouldaマッチエラーvalidarion

def set_total! 
    self.total = products.map(&price).sum 
end 

のように見えます

before_validation :set_total! 
validates :total, presence: true, numericality: { greater_than_or_equal_to: 0 } 

を注文された製品の総合計金額を計算するためのラインでの注文モデルを持っています私の仕様では、合計検証が実装されているかどうかを確認しようとしていますTDD

it { should validate_presence_of(:total) } 
it { should validate_numericality_of(:total).is_greater_than_or_equal_to(0) } 

は、残念ながら、私は次のエラー、私はこの問題を解決するにはどうすればよい

Failure/Error: it { should validate_presence_of(:total) }

Order did not properly validate that :total cannot be empty/falsy. 
    After setting :total to ‹nil› -- which was read back as 
    ‹#<BigDecimal:5634b8b81008,'0.0',9(27)>› -- the matcher expected the 
    Order to be invalid, but it was valid instead. 

    As indicated in the message above, :total seems to be changing certain 
    values as they are set, and this could have something to do with why 
    this test is failing. If you've overridden the writer method for this 
    attribute, then you may need to change it to make this test pass, or 
    do something else entirely. 

を受けるのですか? validate_presence_ofマッチャーを使用して

答えて

1

は手でこのテストを書くとほぼ同等です:

describe Order do 
    it "fails validation when total is nil" do 
    order = Order.new 
    order.total = nil 
    order.validate 
    expect(order.errors[:total]).to include("can't be blank") 
    order.total = 42 
    expect(order.errors[:total]).not_to include("can't be blank") 
    end 
end 

あなたがこのテストを実行した場合、あなたはこれが失敗することを見つけるだろう。どうして?モデルでは、検証を実行するときにtotalをnil以外の値に設定するためです。そのため、このエラーが発生しています。

どちらも失敗することはないので、検証やマッチャーは本当に必要ありません。

関連する問題