Rspec не обрабатывает параметр при получении запроса - PullRequest
0 голосов
/ 06 октября 2018

Я обновляю устаревший проект до 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 голосов
/ 06 октября 2018

Спецификация не работает из-за того, что 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 или .try, чтобы избежать ошибки NoMethodError.

Отсутствие параметра не должно приводить к внутренней ошибке сервера 500.

...