を、そのオブジェクトが呼び出される。EG・シリアライザを打つときスタブアウトActiveRecord::Base.connection
は、そのトリックを行う必要があります。
すべての準備(Arrange
テストの一部)を済ませた後で、気を付けることが一つあります。たとえば、before(:each)
がテストを実行する前にデータベースをクリーニングしている可能性があります。=> ActiveRecord.connectionがトリガされた場合、ElasticSearch => ActiveRecord.connectionが呼び出されてインデックスが作成されるレコードが作成されている可能性があります。
ので、このような何か:
class WorksSearchSerializer
attr_reader :collection
def initialize(collection)
@collection
end
def as_json
[
{
id: work.id
comment_ids: work.comments.map(&:id)
# ... other stuff that may trigger ActiveRecord call
}
]
end
end
require 'rails_helper'
RSpec.describe WorksSearchSerializer do
ShouldNotDoAnyDBConnection = Class.new(StandardError)
subject { described_class.new(es_works) }
let!(:work) { Work.create! } #this triggers ActiveRecord::Base.connection call
let(:es_works) { Work.__elasticsearch__.search({query: { match_all: {} }}.to_json) }
let(:result) { subject.as_json }
before do
sleep 0.2 # wait for ES reindex
end
it 'should not pull any relational DB records' do
allow(ActiveRecord::Base)
.to receive(:connection)
.and_raise(ShouldNotDoAnyDBConnection)
expect(result).to be_kind_of Array
allow(ActiveRecord::Base)
.to receive(:connection)
.and_call_original
end
end