使用其他工厂的数据创建工厂

时间:2014-12-10 01:36:38

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

我正在尝试创建一个FactoryGirl工厂,该工厂依赖于在创建时从其他模型传递的信息。以下是我到目前为止的情况:

FactoryGirl.define do
  factory :completed_set do
    user_id 1
    user_program_id 1
    exercise_id 1
    workout_exercise_id 1
    workout_exercise_set_id 1
    program_id 1
    training_week_id 1
    workout_id 1
    set_number 1
    repetitions 1
    weight 1.5
  end
end

问题是user_id需要是一个实际的user_id,其他几个字段也是如此。我之前可以做(:创建),但我希望能够调用FactoryGirl.attributes_for(:completed_set),这将返回初始值,而不是我想要的值。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

阅读documentation关联。

如果您有工厂:用户,您可以这样做:

FactoryGirl.define do
  factory :completed_set do
    user
    # ... left out for brevity
  end
end

如果你没有,你可以指定工厂:

FactoryGirl.define do
  factory :completed_set do
    association :user, factory: :special_user
    # ... left out for brevity
  end
end

那说:我认为使用嵌套工厂是不好的方式。在应用程序的早期阶段解决一个特定问题似乎是一个好主意。但如果你在另一个测试中依赖这个工厂,它很可能会引入意想不到的副作用。

在我看来,最好在测试的设置阶段构建对象的层次结构:

def setup
  user = FactoryGirl.create(:user)
  @completed_set = FactoryGirl.create(:completed_set, user: user)
end

通过这种方式,您可以确切地知道创建了哪些对象以及它们如何捆绑在一起。

您可以直接设置user_id,而不是设置关联用户(Rails通过将user_id设置为user.id来建立):

def setup
  user = FactoryGirl.create(:user)
  @completed_set = FactoryGirl.create(:completed_set, user_id: user.id)
end

希望这有帮助。