我有一个 ruby on rails 应用程序,具有以下模型。
class User < ApplicationRecord
has_many :crews, dependent: :destroy
end
class Crew < ApplicationRecord
belongs_to :user
end
所以每次我想创建一个
crew
模型时,它都必须引用一个user
模型,否则在尝试保存时会抛出错误。
我正在使用 FactoryBot 在我的单元测试中构建我所有的测试模型,我希望能够同时提供我的用户模型和相关人员模型,但我需要能够引用船员模型。
例如,我有以下用户工厂。
FactoryBot.define do
factory :user do
email { '[email protected]' }
factory :user_with_crew do
after(:create) do |user|
create(:crew, user: user)
end
end
end
end
我可以像这样在我的规范中调用它。
let(:user) { create :user_with_crew }
但是我没有参考我需要进行测试的船员模型。我可以在我的
before
块中进行一些手动创建和分配,但我正在使用 FactoryBot 来尝试让我的代码保持干爽,我确信之前有人不得不这样做。关于如何实现这个的任何想法?
如果我理解正确,我会以不同的方式实现它,实际上是一种更简单的方式。你说“每次你想创建一个团队”,但你使用的是
user
工厂。我建议为船员模型使用工厂,这样你就会有这样的东西:
FactoryBot.define do
factory :crew do
association :user
end
end
有了这个工厂,您可以将用户作为参数传递:
let(:user) { create(:user) }
let(:crew) { create(:crew, user: user }
但是,如果由于某种原因你仍然想使用用户工厂,你可以使用
transient
块来接收船员作为参数。所以你会有这样的东西:
FactoryBot.define do
factory :user_with_crew do
transient do
crew { build(:crew) }
end
after(:create) do |user, evaluator|
evaluator.crew.user_id = user.id
evaluator.crew.save
end
end
end
使用上面的代码,如果你不提供船员,它会为你建造一个,但是,如果你提供一个,那么工厂将使用它。