向使用 FactoryBot 构建的对象添加互惠关联

Add recriprocal association to objects built using FactoryBot

我正在尝试清理一些测试并让它们更快地 运行,并且我有一堆 FactoryBot 生成的项目,这些项目当前已创建并保存到数据库中。显然这对性能不利,所以我试图将其中的大部分更改为使用 build 而不是 create 以避免数据库瓶颈。我当前的问题与使对象具有工作关联有关。我目前拥有的:

class User < ApplicationRecord
  has_many :transaction_items,
           class_name: 'Transaction',
           foreign_key: 'user_id'
end

class Transaction < ApplicationRecord
  belongs_to :user, class_name: 'User'
end

并且测试使用这些 类 像这样:

@user = create(:user)

@transaction1 = create(:transaction, user: @user)
@transaction2 = create(:transaction, user: @user,)

我同意创建 User 对象并将其保存到数据库中,因为我需要它可用于身份验证目的。我需要更改要使用 build 实例化的 Transaction 对象。如果我进行更改,Transaction 对象会知道它们关联的 User 对象(@transaction1.user return 是 User 实例)但反之则不然,即 @user.transaction_items 不 return 关联的 Transaction 对象。它确实 return 一个 Transaction::ActiveRecord_Associations_CollectionProxy 对象,但它是一个空集合。这会导致失败,因为被测试的代码使用了 #transaction_items 方法并且它需要在其中包含关联的对象。

我远不是 FactoryBot 方面的专家,虽然有大量关于 FactoryBot 协会的重要信息,但出于某种原因,我无法让协会正常工作。我需要在这里做什么才能让这种更复杂的协会在我的工厂中运作?

使用 Rails 5.1,FactoryBot v5.0.2

很简单

@user = create(:user)

def build_transaction(user)
  user.transaction_items.build(attributes_for(:transaction, user: user))
end

@transaction1 = build_transaction(@user)
@transaction2 = build_transaction(@user)