在我的应用程序中,对于要创建的用户,程序需要已经存在。创建用户时,会为其分配一个与用户属性匹配的程序。如果不存在适当的程序,并且引发了异常,那么我正在试图弄清楚如何创建程序以便可以创建我的用户。
现在我正在测试中这样做:
subject(:user) do
Program.create!(name: 'test', gender: 'Female', goal_id: '1', experience_id: '1')
User.create!(email: 'test@test.com', password: '12345678', password_confirmation: '12345678', goal_id: '1', experience_level_id: '1', gender: 'Female')
end
但我想创建一个Factory,就像这样:
FactoryGirl.define do
factory :user do
email 'test@test.com'
password '12345678'
password_confirmation '12345678'
goal_id 1
experience_level_id 1
gender 'Female'
end
end
使用FactoryGirl,如果用户需要程序存在,如何创建用户?
答案 0 :(得分:1)
尝试添加association:
factory :user
email "email@test.com"
password "12345678"
password_confirmation "12345678"
goal_id 1
experience_level_id 1
gender "Female"
association :program
end
答案 1 :(得分:1)
我认为这可能就是你想要的。
在你的测试中:
program = FactoryGirl.create(:program)
user = FactoryGirl.create(:user,
:goal_id => program.goal_id,
:gender => program.gender,
:experience_level_id => program.experience_id
)
在你的工厂:
factory :program do
gender "Female"
goal_id '1'
experience_id '1'
name 'test'
end
factory :user do
# other attributes
end
更新:如果您一直想以这种方式设置用户,可以在工厂中执行以下操作:
factory :user do
# other attributes
after(:build) do |user|
program = build(:program)
user.goal_id = program.goal_id
user.gender = program.gender
user.experience_level_id = program.experience_id
end
end
如果您只想在某些测试中使用默认值,则可能需要将工厂重命名为user_with_default_program,并让它从主用户工厂继承。如果您浏览https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md处的文档,那么您应该可以根据自己的使用情况做一些事情。
答案 2 :(得分:0)
您可以让User
工厂在创建过程中查找或创建Program
,并在保存前适当设置User
字段。 User
和Program
之间的关系是什么?你的代码并不明显。