- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我的团队在这个问题上被难住了一段时间了,不知道下一步该去哪里尝试。下面的规范在单独运行时可以正常工作,但是,当我们通过 bundle exec ./bin/rspec spec
在我们的套件中运行它时,这两个测试每次都会失败:
我们已经尝试了多种不同的方法来解决这个问题,我开始怀疑上述规范之外的其他问题。所以我不得不求助于 Stack 大神,并恳请外面的人有更好的方法甚至更好的问题来问这个问题。
Rspec 错误:
8) Retailigence Products and Locations GET /external-products/search/deals Search a given region for related deals by query string
Failure/Error: expect(response_body).to have_json_type(Integer).at_path('deals/0/id')
JsonSpec::MissingPath:
Missing JSON path "deals/0/id"
# ./spec/features/external_products_spec.rb:151:in `block (3 levels) in <top (required)>'
# -e:1:in `<main>'
9) Retailigence Products and Locations GET /external-products/:id/deals Search a given region for deals related to a particular product
Failure/Error: expect(response_body).to have_json_type(Integer).at_path('deals/0/id')
JsonSpec::MissingPath:
Missing JSON path "deals/0/id"
# ./spec/features/external_products_spec.rb:105:in `block (3 levels) in <top (required)>'
# -e:1:in `<main>'
这是我们的 spec_helper.rb:
require 'rubygems'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
require 'email_spec'
require 'pry'
require 'rspec_api_documentation/dsl'
require 'sunspot/rails/spec_helper'
require 'sunspot_test/rspec'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join('spec/concerns/**/*.rb')].each { |f| require f }
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!
# Model specs: type: :model
# Controller specs: type: :controller
# Request specs: type: :request
# Feature specs: type: :feature
# View specs: type: :view
# Helper specs: type: :helper
# Mailer specs: type: :mailer
# Routing specs: type: :routing
RSpec.configure do |config|
config.order = 'random'
config.seed = srand % 0xFFFF
config.infer_spec_type_from_file_location!
config.use_transactional_fixtures = false
config.infer_base_class_for_anonymous_controllers = false
config.before(:each) { GC.disable }
config.after(:each) { GC.enable }
config.include FactoryGirl::Syntax::Methods
config.include JsonSpec::Helpers
config.include Stubs
config.include LoginHelper
config.include SolrSpecHelper
config.include SunspotMatchers
config.include Devise::TestHelpers, type: :controller
config.before do
Sunspot.session = SunspotMatchers::SunspotSessionSpy.new(Sunspot.session)
end
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
RspecApiDocumentation.configure do |config|
config.format = :json
end
features/external_product_service_spec.rb
resource 'Retailigence Products and Locations', type: :feature, api: true, slow: true, sunspot: true do
before(:all) do
log_in_as_client!
end
let(:id) { '7c381d47-d251-457a-a2d2-930c8993a5fa' }
let(:lat) { 39.74585 }
let(:long) { -104.998929 }
let(:q) { 'whiteboard cleaner' }
get '/external-products/:id' do
parameter :id, 'The external id to search', required: true
parameter :lat, 'The latitude to search', required: true
parameter :long, 'The longitude to search', required: true
parameter :radius, 'The radius, in miles, to search'
example 'Search a given region for products matching a given external product id' do
do_request user_email: @user.email, user_token: @token, timestamp: @timestamp
expect(response_body).to have_json_type(Array).at_path('external_products')
expect(response_body).to have_json_type(String).at_path('external_products/0/id')
expect(response_body).to have_json_type(String).at_path('external_products/0/name')
expect(response_body).to have_json_type(String).at_path('external_products/0/seo_slug')
expect(response_body).to have_json_type(String).at_path('external_products/0/description')
expect(response_body).to have_json_type(Array).at_path('external_products/0/images')
expect(response_body).to have_json_type(String).at_path('external_products/0/price')
end
end
get '/external-products/:id/external-stores' do
parameter :id, 'The external id to search', required: true
parameter :lat, 'The latitude to search', required: true
parameter :long, 'The longitude to search', required: true
parameter :radius, 'The radius, in miles, to search'
example 'Search a given region for stores which have the product matching a given external product id' do
do_request user_email: @user.email, user_token: @token, timestamp: @timestamp
expect(response_body).to have_json_type(Array).at_path('external_stores')
expect(response_body).to have_json_type(String).at_path('external_stores/0/id')
expect(response_body).to have_json_type(String).at_path('external_stores/0/name')
expect(response_body).to have_json_type(String).at_path('external_stores/0/store_logo')
expect(response_body).to have_json_type(Float).at_path('external_stores/0/longitude')
expect(response_body).to have_json_type(Float).at_path('external_stores/0/latitude')
expect(response_body).to have_json_type(Float).at_path('external_stores/0/distance')
expect(response_body).to have_json_type(String).at_path('external_stores/0/city')
expect(response_body).to have_json_type(String).at_path('external_stores/0/address')
expect(response_body).to have_json_type(String).at_path('external_stores/0/zip')
expect(response_body).to have_json_type(String).at_path('external_stores/0/state')
expect(response_body).to have_json_type(String).at_path('external_stores/0/phone_number')
end
end
get '/external-products/search' do
parameter :q, 'The query string to search', required: true
parameter :lat, 'The latitude to search', required: true
parameter :long, 'The longitude to search', required: true
parameter :radius, 'The radius, in miles, to search'
example 'Search a given region for products by query string' do
do_request q: q, user_email: @user.email, user_token: @token, timestamp: @timestamp
expect(response_body).to have_json_type(Array).at_path('external_products')
expect(response_body).to have_json_type(String).at_path('external_products/0/id')
expect(response_body).to have_json_type(String).at_path('external_products/0/name')
expect(response_body).to have_json_type(String).at_path('external_products/0/seo_slug')
expect(response_body).to have_json_type(String).at_path('external_products/0/description')
expect(response_body).to have_json_type(Array).at_path('external_products/0/images')
expect(response_body).to have_json_type(String).at_path('external_products/0/price')
end
end
get '/external-products/:id/deals' do
before(:each) do
solr_setup
store.location.save
store.location.reload
store.location.index!
end
let(:retailer) { create :retailer }
let!(:deal) { create :deal, retailer_id: retailer.id }
let!(:store) do
create :store, retailer_id: retailer.id,
location: (create :location, latitude: lat, longitude: long)
end
let!(:retailigence_retailer) do
create :retailigence_retailers_retailer, retailer_id: retailer.id,
retailigence_retailer_id: '39bfd9a5-f979-4ef1-816b-f9a38093494a'
end
let!(:content_location) do
create :content_location, store_id: store.id,
locatable_id: deal.id, locatable_type: 'Deal'
end
parameter :id, 'The external id to search', required: true
parameter :lat, 'The latitude to search', required: true
parameter :long, 'The longitude to search', required: true
parameter :radius, 'The radius, in miles, to search'
example 'Search a given region for deals related to a particular product' do
do_request id: id, user_email: @user.email, user_token: @token, timestamp: @timestamp
expect(response_body).to have_json_type(Array).at_path('deals')
expect(response_body).to have_json_type(Integer).at_path('deals/0/id')
expect(response_body).to have_json_type(Integer).at_path('deals/0/retailer_id')
expect(response_body).to have_json_type(String).at_path('deals/0/title')
expect(response_body).to have_json_type(String).at_path('deals/0/seo_slug')
expect(response_body).to have_json_type(String).at_path('deals/0/name')
expect(response_body).to have_json_type(String).at_path('deals/0/sort_name')
expect(response_body).to have_json_type(String).at_path('deals/0/description')
expect(response_body).to have_json_type(:boolean).at_path('deals/0/is_local')
expect(response_body).to have_json_type(:boolean).at_path('deals/0/is_featured')
expect(response_body).to have_json_type(Array).at_path('images')
end
end
get '/external-products/search/deals' do
before(:each) do
solr_setup
store.location.save
store.location.reload
store.location.index!
end
let(:retailer) { create :retailer }
let!(:deal) { create :deal, retailer_id: retailer.id }
let!(:store) do
create :store, retailer_id: retailer.id,
location: (create :location, latitude: lat, longitude: long)
end
let!(:retailigence_retailer) do
create :retailigence_retailers_retailer, retailer_id: retailer.id,
retailigence_retailer_id: 'eea1722b-ac89-4cce-95ec-26c2414646d7'
end
let!(:content_location) do
create :content_location, store_id: store.id,
locatable_id: deal.id, locatable_type: 'Deal'
end
parameter :q, 'The query string to search', required: true
parameter :lat, 'The latitude to search', required: true
parameter :long, 'The longitude to search', required: true
parameter :radius, 'The radius, in miles, to search'
example 'Search a given region for related deals by query string' do
do_request q: q, lat: lat, long: long,
user_email: @user.email, user_token: @token, timestamp: @timestamp
expect(response_body).to have_json_type(Array).at_path('deals')
expect(response_body).to have_json_type(Integer).at_path('deals/0/id')
expect(response_body).to have_json_type(Integer).at_path('deals/0/retailer_id')
expect(response_body).to have_json_type(String).at_path('deals/0/title')
expect(response_body).to have_json_type(String).at_path('deals/0/seo_slug')
expect(response_body).to have_json_type(String).at_path('deals/0/name')
expect(response_body).to have_json_type(String).at_path('deals/0/sort_name')
expect(response_body).to have_json_type(String).at_path('deals/0/description')
expect(response_body).to have_json_type(:boolean).at_path('deals/0/is_local')
expect(response_body).to have_json_type(:boolean).at_path('deals/0/is_featured')
expect(response_body).to have_json_type(Array).at_path('images')
end
end
end
retailigence_service.rb:
class RetailigenceService
NEGATIVE_KEYWORDS = 'AND !DVD AND !CD AND !"compact disc"'
MAX_QUERY_TIME = 5000
attr_accessor :products, :locations, :params
def self.products(params = {})
fetch(params).products
end
def self.locations(params = {})
fetch_locations(params).locations
end
def self.fetch(params = {})
service = new
service.fetch(params)
service
end
def self.fetch_locations(params = {})
service = new
service.fetch_locations(params)
service
end
def fetch(params = {})
@params = { offset: 0, limit: 25 }.merge(params)
@params.symbolize_keys!
search_result = Retailigence::Product.search(search_params)
@products = search_result.results
build_products
rescue Retailigence::NoResults
@products = []
rescue Retailigence::APIException
@products = []
end
def fetch_locations(params = {})
@params = { offset: 0, limit: 25 }.merge(params)
@params.symbolize_keys!
Rails.logger.debug "[SENDING] #{location_params}"
search_result = Retailigence::Location.search(location_params)
@locations = search_result.results.map { |retailer| retailer.locations }.flatten
build_locations
rescue Retailigence::NoResults
@locations = []
rescue Retailigence::APIException
@locations = []
end
private
def keywords
keywords = @params[:keywords] || ''
keywords << ' ' << NEGATIVE_KEYWORDS
keywords.gsub(/^\ AND\ /, '')
end
def page_size
@params[:limit]
end
def page
(@params[:offset] / @params[:limit]) + 1
end
def location_params
{
userlocation: @params[:userlocation],
requestorid: RETAILIGENCE_REQUESTOR_ID,
productid: @params[:productid],
pagesize: page_size,
page: page,
maxquerytime: MAX_QUERY_TIME,
excludeadultcontent: true
}
end
def search_params
search_params = {
userlocation: @params[:userlocation],
requestorid: RETAILIGENCE_REQUESTOR_ID,
pagesize: page_size, page: page,
maxquerytime: MAX_QUERY_TIME,
excludeadultcontent: true
}
search_params[:keywords] = keywords unless @params[:product_id]
search_params[:productid] = @params[:product_id] if @params[:product_id]
search_params
end
def format_price_prefix(prefix)
prefix = '$' if prefix == 'USD'
prefix
end
def build_products
@products.map! do |p|
p.images ||= []
p.description_long ||= ''
RetailigenceProduct.new(
id: p.id, name: p.name, seo_slug: p.name.slugify,
description: p.description_long,
images: p.images.map { |img| img.link },
price: "#{format_price_prefix p.msrp_currency}#{p.price}",
retailigence_retailer_id: p.location.retailer.id)
end
end
def build_locations
@locations.map! do |l|
RetailigenceLocation.new(
id: l.id, name: l.retailer.name,
latitude: l.latitude, longitude: l.longitude,
phone_number: l.phone, address: l.address.address1,
city: l.address.city, state: l.address.state,
zip: l.address.postal, store_logo: l.retailer.logo,
distance: l.distance.distance)
end
end
end
这是我们在 support/sunspot.rb 中的 Sunspot 设置:
$original_sunspot_session = Sunspot.session
Sunspot.session = Sunspot::Rails::StubSessionProxy.new($original_sunspot_session)
module SolrSpecHelper
def solr_setup
unless $sunspot
$sunspot = Sunspot::Rails::Server.new
pid = fork do
STDERR.reopen('/dev/null')
STDOUT.reopen('/dev/null')
$sunspot.run
end
# shut down the Solr server
at_exit { Process.kill('TERM', pid) }
# wait for solr to start
sleep 5
end
Sunspot.session = $original_sunspot_session
end
end
最佳答案
我以前没有遇到过这个确切的问题,但是我有两个建议/建议可能对将来遇到它的人有所帮助。如果您认为它成功或不成功,请发表评论。
虽然不太理想,但您可以从 Gemfile 的测试组中删除“spring”gem(如果它已包含在那里)。
尝试运行 bundle exec spring binstub --all
以“springify”您的 bin/
目录中的可执行文件。
关于ruby-on-rails - ruby 2.1 rails 4 sunspot solr 测试在套件中失败但单独通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27554145/
我支持 Rails 项目,其中包含 Rails 应用程序和 Solr 的附加实例。 我的环境:rails 3.2.1、ruby 2.1.2、sunspot 2.1.0、Solr 4.1.6。 问题:
在 Solr 中添加和提交之间的根本区别是什么?我们已经阅读了几个文档,但现在仍然非常清楚它到底做了什么,以及何时使用 Add 和何时使用 Commit? 据我了解,Add 将数据添加到 solr 数
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
我们可以在 solr suggester 响应中添加上下文而不是上下文过滤吗? 我有 5 个不同的类别。每个类别都有不同的名称。我的建议者在名字上工作。我可以得到如下输出吗? { "term" :
在 solrconfig.xml 中,filterCache(或 queryResultCache 等)的 'autowarmCount' 表示当新的搜索者到来时将复制多少缓存实体。但是,如果我在 s
我们计划部署 Solr 来搜索从通用 CMS 平台发布的多个站点。 每种语言都有单独的网站,其他语言的内容主要是从英语翻译过来的。 搜索要求包括 – 关键字突出显示、建议(“你是什么意思?”)、停用词
我们有一个系统,使用户能够创建应用程序并在其应用程序上存储数据。我们希望将每个应用程序的索引分开。我们为每个应用程序创建一个核心,并在用户进行查询时搜索给定的应用程序。由于应用程序之间没有任何关系,因
我写了一个小型搜索引擎作为我的每周项目。它基于查询向量和文档向量之间的余弦相似度。向量是使用 tf-idf 标记的疮计算的。 我开始了解 Apache Solr,它是一个全文搜索引擎。我的问题是 so
为了索引我的网站,我有一个 Ruby 脚本,它反过来生成一个 shell 脚本,将我的文档根目录中的每个文件上传到 Solr。 shell 脚本有很多行,如下所示: curl -s \ "htt
是否可以分享Solr fieldType s 定义于 schema.xml多核之间? 我在 Solr 中有许多核心,发现自己正在重新定义 fieldType s 仅基于内置过滤器和分词器。例如
我想通过命令停止 solr 所以如果找到这篇文章 http://rc98.net/solrinit echo "Stopping Solr" cd $SOLR_DIR
我想用守护进程运行 solr。我在另一篇文章中看到有一个可以运行的 init.d 脚本,但它在我的 ubuntu 环境中似乎有问题。每当我尝试使用/etc/init.d/solr start 运行脚本
我有一个 solr 搜索返回上下文突出显示结果,显示网址和电子邮件,句点后带有空格 - 例如“www.google.com”或“email@google.com”无论如何要关闭它,以便它们正常显示?谢
我遇到了一个问题,其中一个列是多值的。例如:值可以是 (11,22) (11,33) (11,55) , (22,44) , (22,99) 我想执行一个分组操作,它将产生: 11 : 计数 3 22
这个问题在这里已经有了答案: How to select distinct field values using Solr? (6 个回答) 6年前关闭。 我有如下 solr 索引数据 7920
背景 使用 Solr 4.0.0。我已经索引了一组示例文档的文本并启用了术语向量,因此我可以使用快速向量突出显示 为了突出显示,我正在使用带有句子边界的 Break Iterator Boundar
题 我在哪里可以找到一个完整的示例,该示例展示了从索引文档到检索搜索结果的分层分面搜索是如何工作的? 我的研究到目前为止 Stackoverflow 有一些帖子,但它们都只针对分层分面搜索的某些方面;
我正在尝试开始使用 Apache Solr,但有些事情我不清楚。通读tutorial ,我已经设置了一个正在运行的 Solr 实例。我感到困惑的是 Solr 的所有配置(架构等)都是 XML 格式的。
我将以下文档存储在 Solr 中: doc { id: string; // this is a unique string that looks like an md5 result
我有一个关于在 solr 中创建嵌套字段的可能性的问题。 谷歌搜索告诉我一些关于组的信息,但我认为它只是为了结果? 我想要的是这样的结构: 类别1 项目 1 (9) 项目 2 (8) 类别2 项目 3
我是一名优秀的程序员,十分优秀!