我的搜索控制器执行此操作:
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不会产生相关结果。
答案 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 }