2016-06-13 7 views
0

私はRuby on Railsの特定のコードをActiveRecord::Base機能からElasticSearchオブジェクトモデルに置き換えるとします(PostgeSQL/MySQL/SQLが呼び出されないようにします(SQLコールがActiveRecordを経由して行われた場合などのテストは例外が発生します)データを検索するときに何のSQLの呼び出しが行われていないことをRSpecの中を確認するために、どのように検索エンドポイント/works/search1回のテストでRails ActiveRecord呼び出しを無効にする/スタブする方法

ため

答えて

0

を、そのオブジェクトが呼び出される。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 
関連する問題