Изпълнявам приложение Rails 4 с rspec-rails 3.0.0 и shoulda-matchers 2.5.0 и имам модел на събитие, който има някои условни валидации като така:
class Event < ActiveRecord::Base
validates :name, :location, :time, :city, :zipcode, :user, :state, presence: true
validates :post_text, presence: true, if: :happened?
validates :pre_text, presence: true, unless: :happened?
belongs_to :community
belongs_to :user
belongs_to :state
def happened?
(self.time < Time.now) ? true : false
end
end
Моят event_spec.rb изглежда така:
require 'spec_helper'
describe Event do
before { @event = FactoryGirl.build(:future_event) }
subject { @event }
it { should validate_presence_of(:time) }
it { should validate_presence_of(:name) }
it { should validate_presence_of(:location) }
it { should validate_presence_of(:user) }
it { should validate_presence_of(:city) }
it { should validate_presence_of(:state) }
it { should validate_presence_of(:zipcode) }
it { should belong_to(:state) }
it { should belong_to(:user) }
it 'has pre_text if future event' do
expect(FactoryGirl.create(:future_event)).to be_valid
end
it 'has post_text if past event' do
expect(FactoryGirl.create(:past_event)).to be_valid
end
end
Но когато стартирам тестовете, моят it { should validate_presence_of(:time) }
блок се проваля, защото продължава да изпълнява оставащите валидации и хвърля изключение за условните валидации, тъй като self.time е нула. Приложих хакерска корекция за това, като проверих time.present? в случилото се? метод. Но може ли някой да ми помогне да разбера кой би бил най-добрият метод за тестване на условни валидации, които изискват наличието на друго поле?