2016-10-19 4 views
1

FactoryGirlでダミーデータを作成しようとしています。FactoryGirlのネストした4つの子要素

ユーザーには多くの投稿があり、投稿には多くの動画があり、ビデオには多くのコメントがあります。 コメントは動画とユーザーに属します。 動画は投稿とユーザーに属します。 投稿はユーザーに帰属します。

少なくとも20人のユーザーを作成したいと思います。少なくとも10人の投稿があり、各投稿には少なくとも1つの動画があり、各動画には少なくとも1つのコメントが付きます。

これまでのところ、私は以下の工場を持っていますが、ビデオやコメントを稼働させることはできません。

スペック/工場/ comments.rb

スペック/工場/ posts.rb

FactoryGirl.define do 
    factory :post do 
    sequence(:title) { |n| "#{n}title" } 
    date Date.today.strftime('%m/%d/%Y') 
    body Faker::Lorem.paragraph(3) 
    tags Faker::Lorem.words(4) 
    user 

    trait :with_videos do 
     after(:build) do |post| 
     create(:video, post: post) 
     end 
    end 
    end 
end 

スペック/工場/ users.rb

FactoryGirl.define do 
    factory :user do 
    first_name Faker::Name.first_name 
    last_name Faker::Name.last_name 
    sequence(:username) { |n| "#{n}username" } 
    sequence(:email) { |n| "#{n}[email protected]" } 
    phone Faker::PhoneNumber.phone_number 
    password Faker::Internet.password(6, 20) 
    country Faker::Address.country 
    state Faker::Address.state_abbr 
    city Faker::Address.city 
    zip Faker::Address.zip 
    seeking_coach true 
    accept_email true 
    accept_phone true 
    end 
end 

スペック/工場/ videos.rb

FactoryGirl.define do 
    factory :video do 
    sequence(:title) { |n| "#{n}title" } 
    sequence(:url) { |n| "https://www.youtube.com/watch?v=tYm_#{n}2oCVdSM" } 
    embed_id { "#{url}.split('=').last" } 
    post 
    user 

    trait :with_comments do 
     after(:build) do |video| 
     create(:comment, video: video) 
     end 
    end 
    end 
end 
私は工場のフックで考える

答えて

0

は、例えばafter(:create)の代わりafter(:build)、次のようになります。

スペック/工場/ users.rb

FactoryGirl.define do 
    factory :user do 
    first_name Faker::Name.first_name 
    last_name Faker::Name.last_name 
    sequence(:username) { |n| "#{n}username" } 
    sequence(:email) { |n| "#{n}[email protected]" } 
    phone Faker::PhoneNumber.phone_number 
    password Faker::Internet.password(6, 20) 
    country Faker::Address.country 
    state Faker::Address.state_abbr 
    city Faker::Address.city 
    zip Faker::Address.zip 
    seeking_coach true 
    accept_email true 
    accept_phone true 

    trait :with_10_posts do 
     after(:create) do |user| 
     create_list(:post, 10, :with_videos, user: user) 
     end 
    end 
    end 
end 

:ここ

after(:create) do |video| 
    create(:comment, video: video) 
end 

は、更新されたすべての工場でありますspec/factories/posts.rb

FactoryGirl.define do 
    factory :post do 
    sequence(:title) { |n| "#{n}title" } 
    date Date.today.strftime('%m/%d/%Y') 
    body Faker::Lorem.paragraph(3) 
    tags Faker::Lorem.words(4) 
    user 

    trait :with_videos do 
     after(:create) do |post| 
     create(:video, :with_comments, post: post) 
     end 
    end 
    end 
end 

スペック/工場/ videos.rb

FactoryGirl.define do 
    factory :video do 
    sequence(:title) { |n| "#{n}title" } 
    sequence(:url) { |n| "https://www.youtube.com/watch?v=tYm_#{n}2oCVdSM" } 
    post 

    trait :with_comments do 
     after(:create) do |video| 
     create(:comment, video: video) 
     end 
    end 
    end 
end 

スペック/工場/ comments.rb

FactoryGirl.define do 
    factory :comment do 
    sequence(:body) { |n| "#{n}body" } 
    video 
    end 
end 

そしてRSpecのテストでは、工場のセットアップが動作することを確認します

describe 'Factories' do 
    it 'creates 20 users, each with at least 10 posts, each post with at least 1 video, each video with at least 1 comment' do 
    FactoryGirl.create_list(:user, 20, :with_10_posts) 
    expect(User.count).to eq(20) 
    user = User.take 
    expect(user.posts.count).to be >= 10 
    post = user.posts.take 
    expect(post.videos.count).to be >= 1 
    video = post.videos.take 
    expect(video.comments.count).to be >= 1 
    end 
end 

すべてのコードは次のとおりです - https://github.com/shhavel/stackoverflow_question_40136020

関連する問題