Как создать родителя с дочерней фабрикой за один шаг, чтобы пройти валидацию
Проекты должны иметь по крайней мере одну задачу, созданную одновременно, чтобы гарантировать, что проверки пройдены. Это фрагмент, который я использую для проверки этого:
class Project < ActiveRecord::Base
validates :tasks, :length => { :minimum => 1 }
...
end
Задача, с которой я столкнулся, - создать правильную фабрику для создания проекта с заданием заранее, используя FactoryGirl. Я использую:
FactoryGirl.define do
factory :task do
name "Get this test passing"
project
end
factory :project do
title "Complete the application"
factory :project_with_tasks do
ignore do
tasks_count 5
end
after(:create) do |project, evaluator|
FactoryGirl.create_list(:task, evaluator.tasks_count, project: project)
end
end
end
end
Теперь проблема в том, что это терпит неудачу, поскольку он фактически создает проект, а затем пытается создать связанную задачу. Ошибка сообщается как:
Failure/Error: project = FactoryGirl.create(:project_with_tasks, tasks_count: 2)
ActiveRecord::RecordInvalid:
Validation failed: Projects must have at least one task
Превращая это в before(:create)
означает, что проект не доступен для ссылки.
Любая помощь будет принята с благодарностью!
2 ответа
В итоге я получил его, построив завод следующим образом:
project = FactoryGirl.build(:project)
project.tasks << FactoryGirl.create(:task)
project.save
Это добавляет задачу в проект перед сохранением.
Можете ли вы примерить до (:create) "построить" задачу для проекта и после (:create) сохранить их, чтобы обойти ошибку проверки?
например:
before(:build) do |instance|
instance.tasks << build(:task, project: instance)
end
after(:create) do |instance|
instance.tasks.each{|t| t.save!}
end