验证:如果条件在rspec中失败

时间:2012-01-10 20:10:39

标签: ruby-on-rails rspec2

在应用中拥有rfq模型。有两个领域。一个是need_report,它是一个布尔值。另一个是report_language,它是一个字符串。逻辑是如果need_report为true,那么report_language中应该有一个条目。否则,如果need_report为false,则report_language可能为空。这是rfq.rb中的代码:

  validates :need_report, :presence => true
  validates_inclusion_of :need_report, :in => [true, false]  
  validates :report_language, :presence => {:if => :need_report?}

  def need_report?
    need_report
  end

但是以下rspec案例失败了:

  it "should be OK for nil report_language if need_report is false" do
    rfq = Factory.build(:rfq, :need_report => false, :report_language => nil)
    rfq.should be_valid    
  end

错误是rfq无效:

  1) Rfq should be OK for nil report_language if need_report is false
     Failure/Error: rfq.should be_valid
       expected valid? to return true, got false
     # ./spec/models/rfq_spec.rb:57:in `block (2 levels) in <top (required)>'

如果从模型中删除“validates:need_report,:presence =&gt; true”,则可以通过此案例。似乎如果need_report为true,则report_language不能为空。

有关这个问题的任何想法?感谢。

1 个答案:

答案 0 :(得分:1)

您无法使用validates_presence_ofvalidates :column, :presence => true来检查布尔列是否为空。

http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_presence_of

答案:您需要使用validates_inclusion_of并指定已有的已接受输入数组。这应该足以验证您想要做什么。

说明:您的第一个验证是在列中看到false(在Ruby中等同于nil)。然后它会在.blank?上运行nil并返回truefalse == nil&amp; nil.blank? == true),这意味着它认为该列为空并且会引发错误。