Stubbing ActiveRecord::Base.connection
sollte den Trick tun.
Eine Sache, auf die man achten sollte, ist, nach allen Vorbereitungen (Arrange
Teil des Tests) auszutreten. Zum Beispiel könnte before(:each)
Datenbank vor dem Ausführen der Tests Reinigungsdatenbank sein => ActiveRecord.connection ausgelöst wird, erstellen Sie möglicherweise einige Datensätze, die von ElasticSearch = ActiveRecord.connection indexiert werden, wird aufgerufen.
so etwas wie folgt aus:
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