Rspec mock ActiveRecord :: Relation вместо объекта класса - PullRequest
2 голосов
/ 31 октября 2019

Я хочу смоделировать одну строку из моей конечной точки:

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

Проблема в том, что мой класс из конечной точки возвращает результат как ActiveRecord_Relation и это мой желаемый результат. Как обновить мой макет, чтобы добиться этого?

1 Ответ

1 голос
/ 31 октября 2019

Я вижу два варианта.

Если вам нужно не касаться БД в спецификации, и достаточно получить 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) }
...