코드의 특정 부분을 ActiveRecord::Base
기능에서 ElasticSearch
객체 모델로 바꾸는 기능이 있다고 가정 해 봅시다 (PostgeSQL/MySQL/SQL이 호출되지 않도록 때 해당 객체가 호출됩니다 타격. 검색 엔드 포인트에 대한 EG 시리얼 /works/search
하나의 테스트를 위해 Rails ActiveRecord 호출을 사용 중지/스터프하는 방법
그래서
코드의 특정 부분을 ActiveRecord::Base
기능에서 ElasticSearch
객체 모델로 바꾸는 기능이 있다고 가정 해 봅시다 (PostgeSQL/MySQL/SQL이 호출되지 않도록 때 해당 객체가 호출됩니다 타격. 검색 엔드 포인트에 대한 EG 시리얼 /works/search
하나의 테스트를 위해 Rails ActiveRecord 호출을 사용 중지/스터프하는 방법
그래서
(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