2016-06-13 3 views

답변

0

(SQL 호출이 액티브를 통해 만들어진 경우 예를 들어, 테스트가 예외를 발생합니다)에는 SQL 호출이 데이터를 검색 할 때 만든되지 않도록 RSpec에에서 확인하는 방법 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