Factorybot如何引用关联记录?

问题描述 投票:0回答:1

我有一个 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 来尝试让我的代码保持干爽,我确信之前有人不得不这样做。关于如何实现这个的任何想法?

ruby-on-rails ruby factory-bot
1个回答
0
投票

如果我理解正确,我会以不同的方式实现它,实际上是一种更简单的方式。你说“每次你想创建一个团队”,但你使用的是

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

使用上面的代码,如果你不提供船员,它会为你建造一个,但是,如果你提供一个,那么工厂将使用它。

© www.soinside.com 2019 - 2024. All rights reserved.