在RSpec中,使用Elasticsearch进行模型测试时,只需要对索引进行初始化的方法是什么?
简而言之
在使用Rspec对Rails的方法进行测试时,针对使用Elasticsearch的模型进行测试时,只有在执行测试前后,才会将Elasticsearch索引初始化的处理方法插入进去。
我想做的事情 (Wǒ zuò de
在使用elasticsearch-railsgem的Rails应用中,我已经实现了使用elasticsearch进行搜索和筛选的方法,如下所示。
class SampleClass < ApplicationRecord
def search(filter_ids, target_ids: [], min_price: nil, max_price: nil, size: 200)
__elasticsearch__.search({
size: size,
query: build_query(filter_ids, target_ids, min_price, max_price)
})
en
end
当我想在RSpec中对这个方法进行测试时,我对应该如何处理感到困惑。因为这次我使用了按照模型分别初始化Elasticsearch索引的方法来实现,所以我想介绍一下这种方法。
在测试环境中是否始终可用?
在Elasticsearch中,创建索引并执行搜索。如果在多个测试用例中共享此索引,则可能在其他测试中对已创建/更新的索引执行测试,导致无法正确测试所需内容,或者导致测试目标方法返回意外结果。
因此,在进行测试前后,我希望进行索引的初始化。但是,在不使用Elasticsearch的方法执行之前和之后,无需编写初始化处理程序,从执行时间的角度来看,我希望尽量将索引的初始化降到最低。
只在使用Elasticsearch的模型测试中进行索引的初始化。
因此,我們決定使用以下步驟來設定它,只對使用Elasticsearch進行測試和建模的項目進行索引的初始化。
在此之前,我們假設Elasticsearch的Docker容器已經被配置好。
1. 设定环境变量
将要使用的Elasticsearch容器的主机和端口预先配置到环境变量中。
elasticsearch:
host: <%= ENV['ELASTICSEARCH_HOST'] || 'localhost' %>
port: <%= ENV['ELASTICSEARCH_PORT'] || '9200' %>
在测试环境中启动Elasticsearch容器。
将在测试环境中读取已设置的环境变量的容器。
有关Rails中Elasticsearch客户端的初始化详细信息,请参阅elasticsearch-ruby。
Elasticsearch::Model.client = Elasticsearch::Client.new(
hosts: [
{
host: Settings.elasticsearch.host,
port: Settings.elasticsearch.port
}
],
log: true
) if Rails.env.test?
可以在spec_helper.rb文件中添加索引初始化的处理。
在引入RSpec时创建的spec_helper.rb文件中,您可以编写每个测试中共同的处理。
我们根据RSpec可定义的元数据,在测试之前创建elasticsearch索引,并在测试之后删除elasticsearch索引。
config.before(:each) do |example|
Product.__elasticsearch__.create_index! if example.metadata[:elasticsearch]
end
config.after(:each) do |example|
Product.__elasticsearch__.delete_index! if example.metadata[:elasticsearch] && Product.__elasticsearch__.index_exists?
end
能够独立进行测试
通过编写这个处理,可以在每次测试之前和之后初始化Elasticsearch索引,从而可以独立地执行每个测试模型的测试。
RSpec.describe SampleClass, type: :model, elasticsearch: true do
end
应用:利用Github Actions将其集成到持续集成(CI)中。
另外,您可以使用Rspec的元数据来进行分支切换,从而将其集成到Github Actions中。在工作流中准备Elasticsearch容器,以便可以从测试执行环境中进行读取即可。
jobs:
rspec:
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.16.3
env:
discovery.type: single-node
ports:
- 9200:9200
steps:
- name: run rspec
env:
ELASTICSEARCH_PORT: ${{ job.services.elasticsearch.ports['9200'] }}
请参阅