我正在尝试创建一个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)
,这将返回初始值,而不是我想要的值。
有什么想法吗?
答案 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
希望这有帮助。