RSpec在获取请求时不处理参数

时间:2018-10-06 15:53:48

标签: ruby-on-rails rspec ruby-on-rails-5 rspec-rails

我正在将一个旧项目升级到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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于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)),或者您应该使用{ {3}},safe navigation operator.fetch以避免NoMethodError。

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

相关问题