2015-11-16 3 views
1

Я работаю над набором тестов RSpec для своего проекта, и я использую FactoryGirl вместо светильников. Я слежу за советом ThoughtBot о том, как нарисовать свой пакет до того, как я его запустил, но я получаю FactoryGirl::InvalidFactoryError, когда я им наплеваю, и я знаю, что это проблема с моими ассоциациями, но я не знаю, как это исправить.FactoryGirl linting errors, association, validates_uniqueness_of

вопрос сводится к трем моделям:

протокола

class Protocol < ActiveRecord::Base 
    validates :name, presence: true, uniqueness: true 
    validates :email, uniqueness: true 
end 

Запись

class Record < ActiveRecord::Base 
    belongs_to :protocol 
    validates_presence_of :protocol 
    # belongs_to and validates_presence_of other things that appear to be working 
end 

Отторжение

class Rejection < ActiveRecord::Base 
    belongs_to :record 
    validates_presence_of :record 
end 

Для того, Record требует Protocol, а Rejection требует: Record. Вот мои заводы:

factory :protocol do 
    name "Protocol name" 
    email "[email protected]" 
end 

factory :record do |r| 
    status "REVIEW" 

    association :protocol 
    # other associations that are not causing issues 
end 

factory :rejection do 
    message "Message text here" 
    association :record 
end 

И когда я нибудь вкусненькое свой пакет, я получаю следующие ошибки:

* record - Validation failed: Name has already been taken, Email has already been taken (ActiveRecord::RecordInvalid) 
* rejection - Validation failed: Name has already been taken, Email has already been taken (ActiveRecord::RecordInvalid) 

Похоже, что Record и Rejection заводов, каждый пытается создать Protocol для выполнения тех валидации, но после первого названия на фабрике Protocol больше не является уникальным, и это заставляет других терпеть неудачу. Как я могу предотвратить эти ошибки? Я был бы в порядке с повторным использованием того же Protocol, но я не знаю, как это сделать. Я попытался сделать это с блоком before(:create) на фабриках Record и Rejection, но это похоже на хрупкий способ обойти его. Любые советы будут очень признательны. Спасибо!

ответ

0

Успех! Я использовал метод FactoryGirl sequence. Я подумал, что это частный API после (неверного) чтения документации, но так как я нашел решение в собственной книге ThoughtBot Testing Rails (которую я купил в бета-версии, и это уже очень полезно), я считаю, что это законно.

Решение было указать name и email в моем Protocol классе как последовательности, например, так:

factory :protocol do 
    sequence(:name) {|n| "Protocol#{n}"} 
    sequence(:email) {|e| "proto_#{e}@example.com}"} 
end 
Смежные вопросы