Rails 5 RSpec测试中FactoryBot生成对象转ActiveRecord Relation方案
可行的解决方案(均不需要修改原有业务代码)
1. 基于where的通用方案(最推荐)
这是工业界普遍使用的标准写法,你可以精确控制Relation中包含的测试记录,完全贴合生产环境的入参形态:
# 先创建你需要的测试对象 let!(:record1) { FactoryBot.create(:class_example) } let!(:record2) { FactoryBot.create(:class_example) } # 生成仅包含上述两条记录的ActiveRecord Relation let(:array) { ClassExample.where(id: [record1.id, record2.id]) }
如果需要单条记录的Relation,直接传入单个id即可:
let(:array) { ClassExample.where(id: FactoryBot.create(:class_example).id) }
2. 特殊场景简化方案
针对空Relation、全表Relation的测试场景,可以直接用Rails自带的方法,不需要提前创建测试对象:
- 测试空入参场景:
let(:array) { ClassExample.none },返回空的ActiveRecord Relation,调用ids会得到空数组 - 测试全表匹配场景:
let(:array) { ClassExample.all },返回包含当前测试库所有class_example表记录的Relation
3. FactoryBot简化写法
如果你用FactoryBot 6.0+版本,可以配合create_list一步生成指定数量记录的Relation:
let(:array) { ClassExample.where(id: FactoryBot.create_list(:class_example, 3).pluck(:id)) }
内容的提问来源于stack exchange,提问作者N0ne
相关产品推荐
相关产品推荐

