通过关联与 has_many 建立记录,无数据库

build record with has_many through association, no db

在测试给定预加载关系时不查询数据库的方法的上下文中,我想构建一个具有预加载关联的记录。我 运行 在尝试通过关系建立具有 has_many 的记录时遇到了麻烦。这不起作用:

let(:preloaded_record) { build(:test_record,
  hmtas: build_list(:has_many_through_association, N)
) }

通过将数据持久保存到数据库来建立关系,然后在数据库中查询此数据以测试方法是否未命中数据库似乎不太理想。

如何在不使用数据库的情况下通过关联构建预加载 has_many 的记录?

需要:实际的记录或接近的模拟,有 .association(:hmtas).loaded?

可选:使用factory_bot

涉及:How to use build method with a has_many :through association

答案是你不知道。 ActiveRecord 关联只是关系数据库之上的抽象,没有它就没有意义 - 关联是由外键关系定义的。

这就是为什么协会没有真正的存根条款。

您可以 stub getter 方法 return 对象数组:

allow(parent).to receive(:children)
                  .and_return(build_list(:children, 10))

但是你需要权衡敏锐度的损失与可能非常微不足道的性能提升。