0

在我的应用程序中,要创建用户,程序需要已经存在。创建用户时,会为他们分配与用户属性匹配的程序。如果不存在适当的程序,并且引发了异常,那么我试图弄清楚如何创建一个程序以便可以创建我的用户。

现在我在我的测试中这样做:

  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

但我想创建一个工厂,如下所示:

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,如果用户需要已经存在的程序,我该如何创建用户?

4

3 回答 3

1

尝试添加关联

  factory :user
    email                 "email@test.com"
    password              "12345678"
    password_confirmation "12345678"
    goal_id               1
    experience_level_id   1
    gender                "Female"
    association           :program
  end
于 2013-10-07T20:51:48.380 回答
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上的文档,您应该能够为您的用例精简内容。

于 2013-10-07T21:00:59.203 回答
0

您可以让User工厂查找或创建一个Program作为创建过程的一部分,并User在保存之前适当地设置字段。User和之间有什么关系Program?从您的代码中并不明显。

于 2013-10-07T20:53:39.393 回答