FactoryGirl 中的四重嵌套子元素
Quadruple nested child elements in FactoryGirl
我正在尝试使用 FactoryGirl 创建虚拟数据。
用户有很多post,post有很多视频,视频有很多评论。
评论属于视频和用户。
视频属于 post 和用户。
Post 属于用户。
我想创建至少 20 个用户,每个用户至少有 10 posts,每个 post 至少有 1 个视频,每个视频至少有 1 条评论。
到目前为止,我有以下工厂,但我似乎无法让视频或评论正常工作。
spec/factories/comments.rb
FactoryGirl.define do
factory :comment do
sequence(:body) { |n| "#{n}body" }
video
user
end
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(:build) do |post|
create(:video, post: post)
end
end
end
end
spec/factories/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@website.com" }
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
spec/factories/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
我认为工厂钩子应该是after(:create)
而不是after(:build)
,例如:
after(:create) do |video|
create(:comment, video: video)
end
这是所有更新的工厂:
spec/factories/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@website.com" }
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
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
spec/factories/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
spec/factories/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/Whosebug_question_40136020
我正在尝试使用 FactoryGirl 创建虚拟数据。
用户有很多post,post有很多视频,视频有很多评论。 评论属于视频和用户。 视频属于 post 和用户。 Post 属于用户。
我想创建至少 20 个用户,每个用户至少有 10 posts,每个 post 至少有 1 个视频,每个视频至少有 1 条评论。
到目前为止,我有以下工厂,但我似乎无法让视频或评论正常工作。
spec/factories/comments.rb
FactoryGirl.define do
factory :comment do
sequence(:body) { |n| "#{n}body" }
video
user
end
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(:build) do |post|
create(:video, post: post)
end
end
end
end
spec/factories/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@website.com" }
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
spec/factories/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
我认为工厂钩子应该是after(:create)
而不是after(:build)
,例如:
after(:create) do |video|
create(:comment, video: video)
end
这是所有更新的工厂:
spec/factories/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@website.com" }
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
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
spec/factories/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
spec/factories/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/Whosebug_question_40136020