У меня есть приложение Rails с набором тестов Rspec, в котором есть некоторые тесты функций/контроллеров в зависимости от ElasticSearch.
Когда мы тестируем функцию поиска в системе (и другие функции в зависимости от ES), мы используем настоящую ES, она отлично работает в среде разработки, когда мы запускаем отдельные файлы спецификаций.
Когда пакет работает на нашем CI-сервере, он становится странным, потому что иногда ES не будет синхронизироваться достаточно быстро, чтобы тесты успешно выполнялись.
Я искал какой-то способ запустить ES в "синхронном режиме" или подождать, пока ES не будет готова, но пока ничего не нашел. Я видел некоторые обходные пути, используя Ruby sleep
, но для меня это кажется неприемлемым.
Как я могу гарантировать синхронизацию ES для запуска моих тестов?
Как вы работаете с ES в своем тестовом пакете?
Вот один из моих тестов:
context "given params page or per_page is set", :elasticsearch do
let(:params) { {query: "Resultados", page: 1, per_page: 2} }
before(:each) do
3.times do |n|
Factory(:company, account: user.account, name: "Resultados Digitais #{n}")
end
sync_companies_index # this is a helper method available to all specs
end
it "paginates the results properly" do
get :index, params
expect(assigns[:companies].length).to eq 2
end
end
Здесь мой блок настройки RSpec и ES-помощник:
RSpec.configure do |config|
config.around :each do |example|
if example.metadata[:elasticsearch]
Lead.tire.index.delete # delete the index for a clean environment
Company.tire.index.delete # delete the index for a clean environment
example.run
else
FakeWeb.register_uri :any, %r(#{Tire::Configuration.url}), body: '{}'
example.run
FakeWeb.clean_registry
end
end
end
def sync_companies_index
sync_index_of Company
end
def sync_leads_index
sync_index_of Lead
end
def sync_index_of(klass)
mapping = MultiJson.encode(klass.tire.mapping_to_hash, :pretty => Tire::Configuration.pretty)
klass.tire.index.create(:mappings => klass.tire.mapping_to_hash, :settings => klass.tire.settings)
"#{klass}::#{klass}Index".constantize.rebuild_index
klass.index.refresh
end
Спасибо за любую помощь!