我正在尝试创建一个 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,其他几个字段也是如此。我可以执行 before(:create),但我希望能够调用 FactoryGirl.attributes_for(:completed_set)
,这将返回初始值,而不是我想要的值。
有什么想法吗?
最佳答案
阅读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
这样您就可以确切地知道创建了哪些对象以及它们是如何绑定(bind)在一起的。
除了设置关联用户(Rails 通过将 user_id 设置为 user.id 来建立)之外,您还可以直接设置 user_id:
def setup
user = FactoryGirl.create(:user)
@completed_set = FactoryGirl.create(:completed_set, user_id: user.id)
end
希望这对您有所帮助。
关于ruby-on-rails - 使用来自其他工厂的数据创建工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27392001/