2016-06-13 2 views
0

Sagen wir, ich ersetze Funktionalität in Ruby on Rails eines bestimmten Stücks Code von ActiveRecord::Base Funktionalität zu ElasticSearch Objektmodell (So dass kein PostgeSQL/MySQL/SQL aufgerufen wird beim Treffen des Objekt aufgerufen wird. zum Beispiel Serializer Such Endpunkt /works/searchWie man jeden Rails ActiveRecord Anruf für einen Test deaktiviert/ausgibt

wie in RSpec, um sicherzustellen, dass kein SQL-Aufruf erfolgen beim Abrufen von Daten (zB Test Ausnahme ausgelöst wird, wenn SQL-Aufruf über Active gemacht wurde)

Antwort

0

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 
Verwandte Themen