【问题标题】:How do I test fulltext fields using sunspot_matchers in rspec?如何在 rspec 中使用 sunspot_matchers 测试全文字段?
【发布时间】:2015-06-27 00:18:12
【问题描述】:

我的搜索控制器会这样做:

search = Sunspot.search(Item) do
  fulltext params[:q] do
    fields(:foo, :bar, :bletch)
  end
end

在我的 rspec 控制器测试中,我有以下内容:

get :show, :q => q

expect(Sunspot.session).to have_search_params(:fulltext, q, proc do
  fields(:foo, :bar, :bletch)
end)

旁注:当我尝试使用块而不是 proc 时,该块从未被执行:

have_search_params(:fulltext, q) do
  # This block was never executed
end

我的 support/sunspot.rb 仅包含以下内容:

Sunspot.session = SunspotMatchers::SunspotSessionSpy.new(Sunspot.session)

当我运行测试时,我收到以下错误:

  1) SearchController GET search when a user runs a search performs a fulltext search on the right fields
     Failure/Error: fields(:foo, :bar, :bletch)
     NoMethodError:
       undefined method `fields' for #<Sunspot::DSL::Search:0x007fa0f0da0168>
     # ./spec/controllers/search_controller_spec.rb:28:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/search_controller_spec.rb:27:in `block (4 levels) in <top (required)>'

在进行全文搜索时,测试控制器是否提供正确参数的正确方法是什么?查询此问题时,Google 没有产生相关结果。

【问题讨论】:

    标签: ruby-on-rails ruby rspec sunspot


    【解决方案1】:

    我在https://github.com/pivotal/sunspot_matchers/issues/23 收到了 Joseph Palermo 的答复。他没有 SO 帐户,所以他允许我在这里复制他的答案:

    关于第一个问题。 do/end 阻塞的原因 使用与运算符有关的语法时不会执行 Ruby 中的优先级。在这种情况下,该块实际上正在被传递 我相信的 expect 方法,而不是 have_search_params 方法。 使用花括号定义的块具有更高的运算符优先级 并因此绑定到你想要它们的 have_search_params。

    现在是您遇到的实际错误。当你通过一个街区 或 proc 到 have_search_params 匹配器,它只需要另一个 参数,要查找的匹配类型。所有实际查询数据 应该在块/过程本身中指定。

    get :show, :q => q
    
    expect(Sunspot.session).to have_search_params(:fulltext) {
      fulltext q do
        fields(:foo, :bar, :bletch)
      end
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 1970-01-01
      • 2018-04-26
      • 2015-11-15
      • 1970-01-01
      • 2012-03-09
      • 2012-07-06
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多