2014-12-30 6 views
1

Я пытаюсь написать тест Rspec, чтобы оценить валидацию модели, чтобы не дать члену спортзала сделать повторную встречу (т. Е. Планировать одно и то же время в тот же день с тренером по фитнесу). У меня есть код работает как ожидалось в моем приложении, но я застрял на том, как написать эффективный тест для сценария.Неудача Rspec-теста объекта FactoryGirl

На две из моих моделей влияет данный тест: во-первых, есть модель назначения, которая принадлежит членам и тренерам. Во-вторых, есть модель участника, которая состоит из информации профиля о спортзале. Существует также модель тренера, но сейчас я просто сосредоточен на получении рабочей спецификации для сценария «член не может иметь дублированную встречу». Я использую камень FactoryGirl для создания тестовых данных.

Вот что я написал для теста «Назначение» RSpec:

it "is invalid when a member has a duplicate appointment_date" do 
FactoryGirl.create(:appointment, appointment_date: "2015-12-02 00:09:00") 
appointment = FactoryGirl.build(:appointment, appointment_date: "2015-12-02 00:09:00") 
appointment.valid? 
expect(appointment.errors[:member]).to include('has already been taken')  
end 

Моя модель Назначения содержит следующее:

belongs_to :member 
belongs_to :trainer 

validates :member, uniqueness: {scope: :appointment_date} 
validates :trainer, uniqueness: {scope: :appointment_date} 

Я создал следующие заводы для назначения и члена :

FactoryGirl.define do 
    factory :appointment do 
    appointment_date "2015-01-02 00:08:00" 
    duration 30 
    member 
    trainer  
    end 
end 

FactoryGirl.define do 
    factory :member do 
    first_name "Joe" 
    last_name "Enthusiast" 
    age 29 
    height 72 
    weight 190 
    goal "fffff" * 5 
    start_date "2014-12-03" 
    end 
end 

Примечание: У меня также есть завод по производству тренажеров.

Когда я запускаю тест RSpec, он генерирует следующее сообщение об ошибке:

Failure/Error: appointment = FactoryGirl.build(:appointment, appointment_date:   "2015-12-02 00:09:00") 
ActiveRecord::RecordInvalid: 
Validation failed: First name has already been taken, Last name has already been taken 

Оказывается Rspec имеет проблемы со вторым объектом FactoryGirl, что я пытаюсь построить, но я не понимаю, что мне нужно для устранения проблемы. Я новичок в Rails, и буду благодарен за любые советы, предложения или мысли о том, как действовать.

ответ

0

При создании двух назначений вы также создаете два member s, которые являются идентичными и, по-видимому, нарушают какое-либо правило, которое у вас есть о членах, которые не имеют того же имени Первой и/или Фамилии. Наилучшим решением было бы создать член

single_member = FactoryGirl.create(:member) 

, а затем передать члену экземпляра к экземплярам назначения FactoryGirl, так что вместо этого он использует свой экземпляр объекта, а не создавать его заново.

FactoryGirl.create(:appointment, appointment_date: "2015-12-02 00:09:00", member: single_member) 
appointment = FactoryGirl.build(:appointment, appointment_date: "2015-12-02 00:09:00", member: single_member) 
appointment.valid? 
expect(appointment.errors[:member]).to include('has already been taken') 
+1

Большое вам спасибо! Ваши рекомендуемые изменения кода сделали трюк. Мой тест Rspec теперь зеленый, и мой код приложения работает так, как ожидалось. Кстати, вы были правы, полагая, что я проверяю уникальность первых и последних имен членов. Тест Rspec собирал эту ссылку из моей модели-члена. Еще раз спасибо! – codeinspired

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