使用 Factory_girl 建立测试中关联
Build in-test associations using Factory_girl
我希望能够仅在每个特定测试中创建与 ID 的关联,尽量避免在工厂中定义它们。
我一直在关注 Rails 4 Test Prescriptions
Avoid defining associations automatically in factory_girl definitions.
Set them test by test, as needed. You’ll wind up with more manageable
test data.
class Workspace < ActiveRecord::Base
has_many :projects
end
class Project < ActiveRecord::Base
belongs_to :workspace
end
这就是我想要的
test "" do
project_with_id = build_stubbed(:project)
workspace_with_id = build_stubbed(:workspace)
workspace_with_id.projects.push(project_with_id)
end
我正在使用 build_stubbed 创建有效的 ID,但出现以下错误:
*** RuntimeError Exception: stubbed models are not allowed to access the database - Project#save({:validate=>true})
所以,阅读工厂女工的documentation我想到了工作协会,但我不想在工厂里定义它们,甚至没有特征。
FactoryGirl.define do
factory :project do
association :workspace, strategy: :build_stubbed
end
end
test "" do
project = build_stubbed(:project)
end
这是有效的,因为我可以调用 project.workspace,并且两者都有有效的 ID
如何创建有效的关联(带ID),但不接触数据库,只使用工厂女孩创建独立对象?
如果您使用 Rspec
,您可以这样做
let!(:user1) { FactoryGirl.create(:user) }
let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user_id: user1.id) }
也在Rspec
let!(:user1) { FactoryGirl.create(:user) }
let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user: user1) }
在minitest/test_unit我相信
user1 = FactoryGirl.create(:user)
user_social_profile1 = FactoryGirl.create(:user_social_profile, user_id: user1.id)
很抱歉,我没有解释与使用 build_stubbed 与工厂协会相关的问题,this 回答很好地解释了这一点。
build_stubbed
初始化记录并伪造持久性。所以你得到的是一条记录,它对 persisted?
的回答是正确的,但有一个伪造的 ID。
它非常有用,但是当涉及关联时该方法不起作用,因为您需要存根 ActiveRecord 的大部分。
相反,您想使用 create
:
before do
@project = create(:project)
@workshop = create(:workshop, project: @project)
end
据我了解,您不需要逆运算即可,例如你会对 workspace.projects
为空感到满意,不是吗?
这应该对你有用:
workspace = build_stubbed(:workspace)
project = build_stubbed(:project, workspace: workspace)
如果你需要workspace.projects
,你可以使用这个:
project = build_stubbed(:project)
workspace = build_stubbed(:workspace, projects: [project])
project.workspace = workspace
我希望能够仅在每个特定测试中创建与 ID 的关联,尽量避免在工厂中定义它们。 我一直在关注 Rails 4 Test Prescriptions
Avoid defining associations automatically in factory_girl definitions. Set them test by test, as needed. You’ll wind up with more manageable test data.
class Workspace < ActiveRecord::Base
has_many :projects
end
class Project < ActiveRecord::Base
belongs_to :workspace
end
这就是我想要的
test "" do
project_with_id = build_stubbed(:project)
workspace_with_id = build_stubbed(:workspace)
workspace_with_id.projects.push(project_with_id)
end
我正在使用 build_stubbed 创建有效的 ID,但出现以下错误:
*** RuntimeError Exception: stubbed models are not allowed to access the database - Project#save({:validate=>true})
所以,阅读工厂女工的documentation我想到了工作协会,但我不想在工厂里定义它们,甚至没有特征。
FactoryGirl.define do
factory :project do
association :workspace, strategy: :build_stubbed
end
end
test "" do
project = build_stubbed(:project)
end
这是有效的,因为我可以调用 project.workspace,并且两者都有有效的 ID
如何创建有效的关联(带ID),但不接触数据库,只使用工厂女孩创建独立对象?
如果您使用 Rspec
let!(:user1) { FactoryGirl.create(:user) }
let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user_id: user1.id) }
也在Rspec
let!(:user1) { FactoryGirl.create(:user) }
let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user: user1) }
在minitest/test_unit我相信
user1 = FactoryGirl.create(:user)
user_social_profile1 = FactoryGirl.create(:user_social_profile, user_id: user1.id)
很抱歉,我没有解释与使用 build_stubbed 与工厂协会相关的问题,this 回答很好地解释了这一点。
build_stubbed
初始化记录并伪造持久性。所以你得到的是一条记录,它对 persisted?
的回答是正确的,但有一个伪造的 ID。
它非常有用,但是当涉及关联时该方法不起作用,因为您需要存根 ActiveRecord 的大部分。
相反,您想使用 create
:
before do
@project = create(:project)
@workshop = create(:workshop, project: @project)
end
据我了解,您不需要逆运算即可,例如你会对 workspace.projects
为空感到满意,不是吗?
这应该对你有用:
workspace = build_stubbed(:workspace)
project = build_stubbed(:project, workspace: workspace)
如果你需要workspace.projects
,你可以使用这个:
project = build_stubbed(:project)
workspace = build_stubbed(:workspace, projects: [project])
project.workspace = workspace