Обновлен до Rails 4 и теперь выдает ошибку «неправильное количество аргументов (1 для 2+)» - PullRequest
2 голосов
/ 07 июня 2019

Я недавно обновил свое приложение с Rails 3 до Rails 4 и пытаюсь запустить тесты спецификаций. Код, который, как я полагаю, раньше работал нормально (до моего появления здесь) внезапно выдает ошибку.

Ошибка:

1) Admin::ReviewsController while logged in #index should get index
     Failure/Error: stub_search("product")
     ArgumentError:
       wrong number of arguments (1 for 2+)
     # ./spec/support/searchkick_stub.rb:5:in `stub_search'
     # ./spec/controllers/admin/reviews_controller_spec.rb:8:in `block (3 levels) in <top (required)>'

Вот так searchkick_stub.rb:

module SearchkickStub
  def stub_search(model)
    klass = model.to_s.camelize.constantize
    klass.any_instance.stub(:reindex) { true }
    klass.stub(:search) do |term, options|
      options ||= {}
      @search_term ||= term
      @search_params ||= options.dup

      response = {
    'hits' => {
          'total' => 0,
          'hits' => [],
    }
      }
      result_opts = {
    # per Searchkick::Query.new
    page: [options[:page].to_i, 1].max,
    per_page: (options[:limit] || options[:per_page] || 100000).to_i,
    padding: [options[:padding].to_i, 0].max,
    load: options[:load].nil? ? true : options[:load],
    # per Searchkick::Query.execute
    includes: options[:include] || options[:includes],
    json: !options[:json].nil?,
      }
      Searchkick::Results.new(klass, response, result_opts)
    end

    # Code that reindexes Products will reindex their Inventories too.
    stub_search(:inventory) if model == :product
  end
end

Подпись stub_search явно указана для одного аргумента, а не для двух или более, как утверждается в сообщении об ошибке.

А вот где мы используем stub_search в reviews_controller_spec.rb

describe ReviewsController do
  include SearchkickStub

  before do
    stub_search(:product)
    ...
  end
end

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Разобрался. Для https://github.com/rspec/rspec-rails/issues/941, проблема была в строке: require 'minitest/autorun' в spec_helper.rb. Эта строка была добавлена ​​для удаления следующих предупреждений:

Warning: you should require 'minitest/autorun' instead.
Warning: or add 'gem "minitest"' before 'require "minitest/autorun"'

Но оказывается, что все, что вам нужно, это gem "minitest" в Gemfile (даже если он уже был установлен, как зависимость для чего-то другого и появился в Gemfile.lock).

1 голос
/ 07 июня 2019

Я думаю, что проблема больше связана с обновлением ruby. Возможно, в интерпретаторе произошли изменения, связанные с обработкой аргументов блока. Метод поиска работает с двумя аргументами в вашем коде: term и options. Но он вызывается только с одним аргументом: "product".

options устанавливается на значение по умолчанию в первой строке в этом блоке с options ||= {}, поэтому не передача опций, возможно, не была проблемой с 1.9.3, но с более строгими проверками аргументов она ломается в 2.1.5.


Простым решением является установка аргумента по умолчанию в аргументах блока, например.

klass.stub(:search) do |term, options|

до

klass.stub(:search) do |term, options={}|

Вы также можете безопасно удалить строку options ||= {} после этого.

...