Я пытаюсь проверить метод проверки, который проверяет совпадение времени для действий.Тестирование пользовательского метода проверки с помощью RSpec
Существует три завода (два из них наследуются от деятельности).
Фабрики:
activities.rb
FactoryGirl.define do
factory :activity do
name 'Fit Girls'
description { Faker::Lorem.sentence(3, true, 4) }
active true
day_of_week 'Thusday'
start_on '12:00'
end_on '13:00'
pool_zone 'B'
max_people { Faker::Number.number(2) }
association :person, factory: :trainer
factory :first do
name 'Swim Cycle'
description 'Activity with water bicycles.'
active true
day_of_week 'Thusday'
start_on '11:30'
end_on '12:30'
end
factory :second do
name 'Aqua Crossfit'
description 'Water crossfit for evereyone.'
active true
day_of_week 'Thusday'
start_on '12:40'
end_on '13:40'
pool_zone 'C'
max_people '30'
end
end
end
Деятельность перекрывается, когда находятся на одном DAY_OF_WEEK (activity.day_of_week == first.day_of_week), на том же pool_zone (activity.pool_zone == first.pool_zone) и времена перекрываются.
Validation метод:
def not_overlapping_activity
overlapping_activity = Activity.where(day_of_week: day_of_week)
.where(pool_zone: pool_zone)
activities = Activity.where(id: id)
if activities.blank?
overlapping_activity.each do |oa|
if (start_on...end_on).overlaps?(oa.start_on...oa.end_on)
errors.add(:base, "In this time and pool_zone is another activity.")
end
end
else
overlapping_activity.where('id != :id', id: id).each do |oa|
if (start_on...end_on).overlaps?(oa.start_on...oa.end_on)
errors.add(:base, "In this time and pool_zone is another activity.")
end
end
end
end
Я написал RSpec тест, но к сожалению, недействительные чеки.
describe Activity, 'methods' do
subject { Activity }
describe '#not_overlapping_activity' do
let(:activity) { create(:activity) }
let(:first) { create(:first) }
it 'should have a valid factory' do
expect(create(:activity).errors).to be_empty
end
it 'should have a valid factory' do
expect(create(:first).errors).to be_empty
end
context 'when day_of_week, pool_zone are same and times overlap' do
it 'raises an error that times overlap' do
expect(activity.valid?).to be_truthy
expect(first.valid?).to be_falsey
expect(first.errors[:base].size).to eq 1
end
end
end
end
Возврат:
Failure/Error: expect(first.valid?).to be_falsey
expected: falsey value
got: true
Я не могу понять, почему он получил так. Сначала create (: activity) должен быть прав, но следующий не должен выполняться (перекрывается). Я пробовал добавить expect(activity.valid?).to be truthy
до expect(first.valid?...
, но выбрасывает другую ошибку ActiveRecord::RecordInvalid
. Может ли кто-нибудь отремонтировать мой тест? Я новичок в создании тестов с использованием RSpec.
UPDATE: Решение для моей проблемы не создает: сначала в тесте, а в сборке. let(:first) { build(:first) }
У вас есть право. Это имеет смысл, но, как я уже упоминал first.valid? возвращает 'RecordInvalid'. Вы знаете, что может быть причиной? –
Проверка подлинности завершается с ошибкой при создании фабричного объекта 'first'. Проверьте проверки, которые вы определили в 'activity.rb'. –
@Arun Factory создаёт пользу для использования! так что исключение показывает, что ваша проверка завершается –