Rspec 不处理获取请求的参数

Rspec not processing param on get request

我正在将遗留项目升级到 rails 5.0,现在其中一个测试失败了。 测试如下:

describe "tag searching" do
    before (:each) do
      @admin = FactoryGirl.create(:admin)
      stub_authenticate_client(@admin)
    end

    it "doesnt break a badly formatted tag search" do
      get :search, params: {search: {tags: "a"}}
      expect(assigns(:tags)).to_not be_nil
      expect(assigns(:reports)).to_not be_nil
    end

    it "doesnt break with a search with no tag params" do
      get :search, params: {search: {}}
      expect(assigns(:tags)).to_not be_nil
      expect(assigns(:reports)).to_not be_nil
    end
  end

错误发生在第二次测试中,即没有标记参数的搜索。在我的控制器中,我调用 params[:search][:tags] 并得到

Failure/Error: if params[:search][:tags].nil?

     NoMethodError:
       undefined method `[]' for nil:NilClass

似乎搜索参数没有通过,但它适用于第一个测试。

控制器:

def search
    search_params = params['search']
    @reports = Report.includes([Report::TAG_CATEGORIES.keys].flatten)
                     .paginate(:page => params['page'],
                               :per_page => 50)

    tags = extract_tags_from_params(search_params['tags']) # ERROR HERE
    tags.each do |category, search_values|
      @reports = @reports.tagged_with(search_values, match: :all, on: category) if !search_values.blank?
    end

    @reports = @reports.where(#some queries related to search param)
    @tags = Report.flattened_tags
    render 'index'
end

  def search_params
    params.permit(search: {})
  end

有什么想法吗?

由于 RSpec 自动忽略空参数,规范失败。

这种情况有一个非常简单的解决方法:

it "doesnt break with a search with no tag params" do
  get :search, params: {search: { foo: ''}}
  expect(assigns(:tags)).to_not be_nil
  expect(assigns(:reports)).to_not be_nil
end

但是您收到 NoMethodError 的事实应该告诉您您的控制器操作已损坏,如果搜索参数不存在(使用 params.require(:search))或者您应该使用, .fetch or .try 以避免 NoMethodError。

缺少参数不应导致 500 内部服务器错误。