【问题标题】:how to create factory that passes override through associations如何创建通过关联传递覆盖的工厂
【发布时间】:2021-03-30 19:32:39
【问题描述】:
class User < ActiveRecord::Base
  belongs_to :account
end

class Account < ActiveRecord::Base
  has_many :users
  has_many :reminders
end

class Reminder < ActiveRecord::Base
  belongs_to :account
  belongs_to :user
end

factory :user do
  account
end

factory :reminder do
 account
 user
end

如何修改:reminder 工厂,以便我可以传入一个帐户,该帐户将用于提醒和用户?

r = FactoryBot.create(:reminder, account: Account.last)
r.account.id == r.user.account.id

【问题讨论】:

    标签: ruby factory-bot


    【解决方案1】:

    如果默认值不适合您,您可以将块传递给工厂属性定义。在当前情况下,您要确保帐户和用户匹配。

    factory :reminder do
      account
      user { build(:user, account: account) }
    end
    

    如果工厂需要构建用户,这将确保用户使用相同的帐户。这将满足您的要求。但是,还有另一种情况没有涉及。如果您传入一个用户,但没有帐户,则将建立一个新帐户,并且帐户将不匹配。检查给定用户可以缓解这种情况。

    @overrides有传入的属性。

    factory :reminder do
      account { @overrides[:user]&.account || build(:account) }
      user { build(:user, account: account) }
    end
    

    现在如果只有用户或唯一帐户被传递到工厂,那么生成的提醒将有帐户匹配。

    【讨论】:

      【解决方案2】:

      试试FactoryBot.build,它会构建具有已定义关联的模型,但是当您将它们分配给最后一行的帐户时,应该稍后替换它们:

      r = FactoryBot.build(:reminder)
      u = FactoryBot.build(:user)
      a = FactoryBot.create(:account, users: [u], reminders: [r])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        相关资源
        最近更新 更多