Ruby on rails 筛选引用表单在rspec测试中失败

Ruby on rails 筛选引用表单在rspec测试中失败,ruby-on-rails,rspec,filterrific,Ruby On Rails,Rspec,Filterrific,在rspec中使用Filterrific表单测试视图失败,错误如下: 1) members/index renders a list of members Failure/Error: <%= form_for_filterrific @filterrific do |f| %> ActionView::Template::Error: No route matches {:action=>"index", :controller=>"test"} # /h

在rspec中使用Filterrific表单测试视图失败,错误如下:

1) members/index renders a list of members
 Failure/Error: <%= form_for_filterrific @filterrific do |f| %>

 ActionView::Template::Error:
   No route matches {:action=>"index", :controller=>"test"}
 # /home/spfolly/.rvm/gems/ruby-2.3.0/gems/filterrific-5.0.1/lib/filterrific/action_view_extension.rb:19:in `form_for_filterrific'
 # ./app/views/members/index.html.erb:20:in `_app_views_members_index_html_erb__4554187109976153340_52575240'
 # ./spec/views/members/index.html.erb_spec.rb:42:in `block (2 levels) in <top (required)>'
 # ------------------
 # --- Caused by: ---
 # ActionController::UrlGenerationError:
 #   No route matches {:action=>"index", :controller=>"test"}
 #   /home/spfolly/.rvm/gems/ruby-2.3.0/gems/filterrific-5.0.1/lib/filterrific/action_view_extension.rb:19:in `form_for_filterrific'
1)成员/索引呈现成员列表
失败/错误:
ActionView::模板::错误:
没有路由匹配{:action=>“index”,:controller=>“test”}
#/home/spfolly/.rvm/gems/ruby-2.3.0/gems/filterrific-5.0.1/lib/filterrific/action\u view\u extension.rb:19:格式为“filterrific”
#./app/views/members/index.html.erb:20:in`_app_views_members_index_html_erb_455418710997615340_52575240'
#./spec/views/members/index.html.erb_spec.rb:42:in'block(2层)in'
# ------------------
#---原因:---
#ActionController::UrlGenerationError:
#没有路由匹配{:action=>“index”,:controller=>“test”}
#/home/spfolly/.rvm/gems/ruby-2.3.0/gems/filterrific-5.0.1/lib/filterrific/action\u view\u extension.rb:19:格式为“filterrific”
控制器名称“test”是rspec的一个怪癖吗?我是否需要一个“测试”路线,仅用于Filterrific rspec测试

如何修复此错误?

已解决

“在遇到同样的问题后,我们发现可以通过在ActionView::TestCase::TestController上存根controller_name方法来解决这个问题

原因: RSPEC使用ActhVIEW::TestCase::TestController作为所有视图测试的通用控制器,因此:上文所述的是:控制器= >“测试”(注意:RSPEC确实考虑命名空间。例如,如果您的视图位于“admin”的命名空间之下,那么错误将不表示路由匹配:“控制器= >“admin/test”)。Filterrific只是通过调用controller.controller_name(请参阅)来使用控制器的名称。因此,在Rspec视图测试中,它将控制器名称设置为“test”。要使测试通过,可以存根controller_name以返回不同的值

例如: 这是我如何设置Rspec视图测试的一个完整示例。只有第一行是修复本期中描述的问题所必需的,但我认为我应该包括其余部分,因为在线上似乎没有太多关于测试使用Filterrific的代码的信息

before(:each) do
  allow_any_instance_of(ActionView::TestCase::TestController).to receive(:controller_name).and_return('members') # CUSTOMIZE THIS; Fixes the "No route matches" problem
  @filterrific = Filterrific::ParamSet.new(User, {})
  @filterrific.select_options = {
    filter_role: User.filter_role_options,
    filter_status: User.filter_status_options,
  }
  @users = [ build_stubbed(:user) ]
end