我正在尝试使用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
任何想法可能是什么原因造成的?任何帮助将非常感激。预先感谢!
答案 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
代码。我不确定吗?