Я запускаю приложение 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? в случившемся? метод. Но может ли кто-нибудь помочь мне понять, как лучше всего тестировать условные проверки, требующие наличия другого поля?