如何在rspec中使用sunspot_matchers测试全文字段?

时间:2015-06-27 00:18:12

标签: ruby-on-rails ruby rspec sunspot

我的搜索控制器执行此操作:

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

我的支持/ 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不会产生相关结果。

1 个答案:

答案 0 :(得分:1)

我收到约瑟夫巴勒莫在https://github.com/pivotal/sunspot_matchers/issues/23的答复。他没有SO帐户,所以他允许我在这里重现他的答案:

  

关于第一个问题。 do / end块的原因   当你使用该语法与operator有关时,不会执行   Ruby中的优先级。在这种情况下,块实际上正在通过   对于我认为的expect方法,而不是have_search_params方法。   使用花括号定义的块具有更高的运算符优先级   然后绑定到你想要的have_search_params。

     

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

get :show, :q => q

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