Rspec 模拟 ActiveRecord::Relation 而不是 class 对象
Rspec mock ActiveRecord::Relation instead of class object
我想从我的端点模拟一行:
InquiryProcessFilters::CompanyName.new(params[:filters][:company_name].downcase).call
所以我模拟了:
let(:company_name_filter_mock) { instance_double(InquiryProcessFilters::CompanyName) }
before do
allow(InquiryProcessFilters::CompanyName).to(receive(:new).and_return(company_name_filter_mock))
allow(company_name_filter_mock).to receive(:call).and_return(second_inquiry_process)
end
问题是我的 class 来自端点 returns 结果为 ActiveRecord_Relation
,这是我想要的结果。如何更新我的模拟来实现这一点?
我可以看到两个选项。
如果您不关心规范中的 DB 并且足以获得 Enumerable
,请将数组分配给 second_inquiry_process
,例如:
let(:second_inquiry_process) { [inquiry_process_instance] }
或使用 FactoryBot
let(:second_inquiry_process) { build_list :inquiry_process, 1 }
如果你想拥有完整的 AR 关系(我想你会这样做),请在数据库中创建记录并将它们分配给变量,例如:
let(:inquiry_process_instance) { create :inquiry_proces }
let(:second_inquiry_process) { InquiryProcess.where(id: inquiry_process_instance.id) }
我想从我的端点模拟一行:
InquiryProcessFilters::CompanyName.new(params[:filters][:company_name].downcase).call
所以我模拟了:
let(:company_name_filter_mock) { instance_double(InquiryProcessFilters::CompanyName) }
before do
allow(InquiryProcessFilters::CompanyName).to(receive(:new).and_return(company_name_filter_mock))
allow(company_name_filter_mock).to receive(:call).and_return(second_inquiry_process)
end
问题是我的 class 来自端点 returns 结果为 ActiveRecord_Relation
,这是我想要的结果。如何更新我的模拟来实现这一点?
我可以看到两个选项。
如果您不关心规范中的 DB 并且足以获得 Enumerable
,请将数组分配给 second_inquiry_process
,例如:
let(:second_inquiry_process) { [inquiry_process_instance] }
或使用 FactoryBot
let(:second_inquiry_process) { build_list :inquiry_process, 1 }
如果你想拥有完整的 AR 关系(我想你会这样做),请在数据库中创建记录并将它们分配给变量,例如:
let(:inquiry_process_instance) { create :inquiry_proces }
let(:second_inquiry_process) { InquiryProcess.where(id: inquiry_process_instance.id) }