FactoryGirl:创建一个需要程序已经存在的用户

时间:2013-10-07 20:45:42

标签: ruby-on-rails rspec factory-bot

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

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

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

3 个答案:

答案 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字段。 UserProgram之间的关系是什么?你的代码并不明显。