rspec失败:预期1个errors_on,得到3

时间:2014-03-31 06:51:28

标签: ruby-on-rails ruby rspec

class Card < ActiveRecord::Base
  belongs_to :trade_type,:class_name => 'TradeType',:foreign_key => 'trade_type_id'
  belongs_to :restaurant,:class_name => 'Restaurant',:foreign_key => 'restaurant_id'
  validates_presence_of :card_no,:message => '卡号不能为空'
  validates_numericality_of :card_no,:message => '卡号必须是数字'
  validates_length_of :card_no,:is => 16,:message => '卡号必须是16位'
  validates_uniqueness_of :card_no,:message => '卡号不能重复'
end

describe Card do
  it 'is valid with card_no,name'do
     card = Card.new(
         card_no: '1054321239876456',
         name: 'zhangsan',
     )
    expect(card).to be_valid
  end

  it 'is invalid without a card_no' do
    card = Card.new(card_no:nil)
    expect(card).to have(1).errors_on(:card_no)
  end
end

1 个答案:

答案 0 :(得分:0)

您看到3个错误而不是1个错误的原因是因为Card.card_no为空。这意味着它也不是数字,也不是16个字符。

即。全部三个

validates_presence_of :card_no,:message => '卡号不能为空'
validates_numericality_of :card_no,:message => '卡号必须是数字'
validates_length_of :card_no,:is => 16,:message => '卡号必须是16位'

失败了。

如果您希望仅在存在卡号时验证数字和length_of,请添加allow_blank: true

validates_presence_of :card_no,:message => '卡号不能为空'
validates_numericality_of :card_no, :allow_blank => true, :message => '卡号必须是数字'
validates_length_of :card_no, :is => 16, :allow_blank => true, :message => '卡号必须是16位'