2016-08-13 2 views
0

Я пытаюсь проверить метод проверки, который проверяет совпадение времени для действий.Тестирование пользовательского метода проверки с помощью 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) }

ответ

2

Эта линия сама по себе

let(:activity) { create(:activity) } 

не создает активности. Он создает только активность, когда на самом деле вызывается activity. Поэтому перед запуском теста вы должны позвонить activity.

Есть несколько способов сделать это, например, перед тем блоком:

before { activity } 

или вы могли бы использовать let! вместо того, чтобы просто let.

+0

У вас есть право. Это имеет смысл, но, как я уже упоминал first.valid? возвращает 'RecordInvalid'. Вы знаете, что может быть причиной? –

+0

Проверка подлинности завершается с ошибкой при создании фабричного объекта 'first'. Проверьте проверки, которые вы определили в 'activity.rb'. –

+0

@Arun Factory создаёт пользу для использования! так что исключение показывает, что ваша проверка завершается –

Смежные вопросы