2013-11-29 4 views
0

У меня есть две модели Project и ProjectImage. A project должен иметь по крайней мере один project_image. Это хорошо работает в моем приложении, но когда дело доходит до тестирования, я не знаю, как подойти к нему.FactoryGirl, определяющий объект, который должен иметь хотя бы один объект

У меня есть проект завода:

factory :project do 
    title { Faker::Lorem.word(5) } 
    intro { Faker::Lorem.word(5) } 

    association :user, factory: :user 
end 

И мой project_image завод.

factory :project_image do 
    image { File.open(Dir.glob(File.join(Rails.root, 'sampleimages/projects', '*')).sample) } 

    association :project, factory: :project 
    association :user, factory: :user 
end 

Очевидно, что мой завод проекта недействителен, так как он должен иметь хотя бы одно изображение. Поэтому я думал, что это требует ассоциации, но это просто создаст круговую зависимость. Они зависят друг от друга, поэтому я уверен, как создать одно без другого.

ответ

1

Я думаю, что вы можете взломать его таким образом

factory :project do 
    title { Faker::Lorem.word(5) } 
    intro { Faker::Lorem.word(5) } 

    association :user, factory: :user 

    after(:build) do |project| 
    FactoryGirl.build(:project_image, project: project) 
    end 
end 

PS Вы можете определить заводов немного легче

factory :project_image do 
    image { File.open(Dir.glob(File.join(Rails.root, 'sampleimages/projects', '*')).sample) } 

    project 
    user 
end 

PPS если ответ непосредственно на ваш вопрос

Я подумал, что это требует ассоциации, но это просто создаст круговую зависимость

Вы можете передать атрибут (ы) на завод и использовать его вместо того, что вы определяете на фабрике файлов. Пример: вам нужен проект с 3 фотографиями

project = FactoryGirl.create(:project) # this project has one picture created in factory 
FactoryGirl.create_list(:project_image, 2, project: project) # this will create two pictures for existed project 

project.reload # you need update local varial to fetch new records from DB 
project.project_images.size # => 3 
+0

У меня до сих пор такая же ошибка – ediblecode

+0

Вы пытались создать/создать записи через заводы на консоли? Поместите factory_girl gem в группу тестирования/разработки, запустите консоль в режиме песочницы 'rails c -s', выполните' require factory_girl_rails' и попробуйте отладить объекты, например 'project = FactoryGirl.build (: project); project.project_images; project.valid? ' – gotva

+0

еще одна идея, почему у вас все еще есть проблема: попробуйте этот код в' after (: build) '' project.project_images = [FactoryGirl.build (: project_image)] ' – gotva

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