проверяется с помощью: если условие не выполнено в rspec - PullRequest
0 голосов
/ 11 января 2012

Наличие модели 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, :sence => true» удалено из модели.Похоже, что если Need_report верен, то report_language не может быть пустым.

Есть какие-нибудь мысли по поводу проблемы?Спасибо.

1 Ответ

1 голос
/ 11 января 2012

Вы не можете использовать validates_presence_of или validates :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 и возвращает true (false == nil & nil.blank? == true), что означает, что он считает столбец пустым и выдает ошибку.

...