Searchkick未在RSpec

时间:2018-06-20 03:48:49

标签: elasticsearch rspec searchkick

我正在尝试使用RSpec来利用Searchkick测试一个类。

我的规格支持目录中包含以下内容:

RSpec.configure do |config|
  config.before(:suite) do
    # Reindex models
    Restaurant.reindex
    # and disable callbacks
    Searchkick.disable_callbacks
  end

  config.around(:each, search: true) do |example|
    Searchkick.callbacks(true) do
      example.run
    end
  end
end

我的测试如下:

describe Restaurants::SearchFacade, search: true do
  subject { described_class }

  describe '#search' do
    context 'with a query' do
      let!(:restaurant_1) { create(:restaurant, :reindex, description: 'Amazing sour dough pizza place') }
      let!(:restaurant_2) { create(:restaurant, :reindex) }

      it 'returns values containing the query' do
        Restaurant.search_index.refresh
        params = { search: { query: 'sour dough' } }
        facade = subject.new(params)

        expect(facade.search.total_count).to eq(1)
      end
    end
  end
end

我应该收到1个结果。但是,Searchkick返回0个结果。这对外观没有问题,因为我也尝试过Restaurant.search('*'),它应该返回所有结果,但是什么也不会返回。

我的餐厅类如下:

class Restaurant < ApplicationRecord
  searchkick searchable: %i[title description street_address]
end

我的工厂看起来像这样:

FactoryBot.define do
  factory :restaurant do
    association :plan
    association :company
    sequence :title do |n|
      "Restaurant #{n}"
    end
    description 'An awesome restaurant'
    # More attributes here...

    trait :reindex do
      after(:create) do |restaurant, _evaluator|
        restaurant.reindex(refresh: true)
      end
    end
  end
end

任何想法可能是什么原因造成的?任何帮助将非常感激。预先感谢!

1 个答案:

答案 0 :(得分:0)

尝试摆脱以前在(:suite)和工厂中正在使用的所有奇特的东西。您只需在每个规格之前进行操作(如果已设置搜索标签)。

我能够使searchkick与rspec一起工作,并仅使用spec_helper.rb中的少量代码为模型建立索引:

RSpec.configure do |config|
   config.before(:each) do |example|
      # Elasticsearch / Searchkick
      if example.metadata[:search]
         Searchkick.enable_callbacks
         Restaurant.reindex
      else
         Searchkick.disable_callbacks
      end
   end
end

旁注:在您的规范设置中创建了一堆Restaurant记录后,您可能仍需要运行Restaurant.search_index.refresh代码。我不确定吗?