factory_girl 有关联的工厂没有正确分配 ID
factory_girl factories with associations not assigning IDs correctly
我有 3 个模型是这样关联的:
#user.rb
has_many :forums
has_many :posts
#forum.rb
belongs_to :user
has_many :posts
#post.rb
belongs_to :user
belongs_to :forum
我正在尝试创建一组工厂,它们都共享彼此关联所需的 ID。
#User factory
FactoryGirl.define do
factory :user do
sequence :email do |n|
"testuser#{n}@postfactory.com"
end
password "password#1"
end
end
#Forum factory
FactoryGirl.define do
factory :forum do
user
name "Forum Name"
description "Forum Description with a minimum character count of 20"
end
end
#Post factory
FactoryGirl.define do
factory :post do
user
forum
title 'Post 1'
description 'This is a test description for Post 1'
end
end
当我 运行 我的规范测试时:
user = FactoryGirl.create(:user)
forum = FactoryGirl.create(:forum)
post = FactoryGirl.create(:post)
它在控制台中输出以下内容:
#<User id: 1, email: "testuser1@userfactory.com", created_at: "2016-10-27 20:10:36", updated_at: "2016-10-27 20:10:36">
#<Forum id: 1, name: "Forum Name", description: "Forum Description with a minimum character count o...", user_id: 2, created_at: "2016-10-27 20:10:36", updated_at: "2016-10-27 20:10:36">
#<Post id: 1, title: "Post 1", description: "This is a test description for Post 1", user_id: 3, forum_id: 2, created_at: "2016-10-27 20:10:36", updated_at: "2016-10-27 20:10:36">
如您所见,user_id
随着每个工厂的创建而增加 forum_id
。我希望这些都具有 1
的 ID,而无需进行一些手动操作。我的设置哪里做错了
编辑:我有点明白我做错了什么。我只需要在我的规范测试中生成一个 post
,它将生成创建 post
所需的工厂(论坛和用户)。但是,我确实注意到我生成了两个用户。
(byebug) User.count
2
(byebug) User.first
#<User id: 1, email: "testuser1@postfactory.com", created_at: "2016-10-27 20:30:33", updated_at: "2016-10-27 20:30:33">
(byebug) User.last
#<User id: 2, email: "testuser2@postfactory.com", created_at: "2016-10-27 20:30:33", updated_at: "2016-10-27 20:30:33">
知道这是为什么吗?我尝试删除 sequence :email
部分并按照标准进行。但是,我收到一个验证错误,表明该电子邮件已被接收。出于某种原因,它试图 运行 user
工厂两次,即使我在我的规范测试中只调用它一次。
每次你调用FactoryGirl.create
,都会有一个新创建的用户,所以在你运行这个代码之后:
user = FactoryGirl.create(:user)
forum = FactoryGirl.create(:forum)
post = FactoryGirl.create(:post)
实际上您创建了 3 个用户,如您所见 post 有 user_id: 3
。
如果您想创建论坛和 post 您创建的用户,您可以在创建论坛和 post 时将该用户分配给他们:
user = FactoryGirl.create(:user)
forum = FactoryGirl.create(:forum, user: user)
post = FactoryGirl.create(:post, user: user, forum: forum)
使用此代码,只有一个创建的用户。
我有 3 个模型是这样关联的:
#user.rb
has_many :forums
has_many :posts
#forum.rb
belongs_to :user
has_many :posts
#post.rb
belongs_to :user
belongs_to :forum
我正在尝试创建一组工厂,它们都共享彼此关联所需的 ID。
#User factory
FactoryGirl.define do
factory :user do
sequence :email do |n|
"testuser#{n}@postfactory.com"
end
password "password#1"
end
end
#Forum factory
FactoryGirl.define do
factory :forum do
user
name "Forum Name"
description "Forum Description with a minimum character count of 20"
end
end
#Post factory
FactoryGirl.define do
factory :post do
user
forum
title 'Post 1'
description 'This is a test description for Post 1'
end
end
当我 运行 我的规范测试时:
user = FactoryGirl.create(:user)
forum = FactoryGirl.create(:forum)
post = FactoryGirl.create(:post)
它在控制台中输出以下内容:
#<User id: 1, email: "testuser1@userfactory.com", created_at: "2016-10-27 20:10:36", updated_at: "2016-10-27 20:10:36">
#<Forum id: 1, name: "Forum Name", description: "Forum Description with a minimum character count o...", user_id: 2, created_at: "2016-10-27 20:10:36", updated_at: "2016-10-27 20:10:36">
#<Post id: 1, title: "Post 1", description: "This is a test description for Post 1", user_id: 3, forum_id: 2, created_at: "2016-10-27 20:10:36", updated_at: "2016-10-27 20:10:36">
如您所见,user_id
随着每个工厂的创建而增加 forum_id
。我希望这些都具有 1
的 ID,而无需进行一些手动操作。我的设置哪里做错了
编辑:我有点明白我做错了什么。我只需要在我的规范测试中生成一个 post
,它将生成创建 post
所需的工厂(论坛和用户)。但是,我确实注意到我生成了两个用户。
(byebug) User.count
2
(byebug) User.first
#<User id: 1, email: "testuser1@postfactory.com", created_at: "2016-10-27 20:30:33", updated_at: "2016-10-27 20:30:33">
(byebug) User.last
#<User id: 2, email: "testuser2@postfactory.com", created_at: "2016-10-27 20:30:33", updated_at: "2016-10-27 20:30:33">
知道这是为什么吗?我尝试删除 sequence :email
部分并按照标准进行。但是,我收到一个验证错误,表明该电子邮件已被接收。出于某种原因,它试图 运行 user
工厂两次,即使我在我的规范测试中只调用它一次。
每次你调用FactoryGirl.create
,都会有一个新创建的用户,所以在你运行这个代码之后:
user = FactoryGirl.create(:user)
forum = FactoryGirl.create(:forum)
post = FactoryGirl.create(:post)
实际上您创建了 3 个用户,如您所见 post 有 user_id: 3
。
如果您想创建论坛和 post 您创建的用户,您可以在创建论坛和 post 时将该用户分配给他们:
user = FactoryGirl.create(:user)
forum = FactoryGirl.create(:forum, user: user)
post = FactoryGirl.create(:post, user: user, forum: forum)
使用此代码,只有一个创建的用户。