升级到Rails 4,现在收到“错误的参数数量(1个代表2个以上)”错误

时间:2019-06-07 17:43:11

标签: ruby-on-rails-4 rspec

我最近将我的应用程序从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的签名显然是针对单个参数,而不是像错误声明那样是两个或多个参数。

这是我们在reviews_controller_spec.rb中使用stub_search的地方

describe ReviewsController do
  include SearchkickStub

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

2 个答案:

答案 0 :(得分:2)

弄清楚了。对于https://github.com/rspec/rspec-rails/issues/941,问题出在以下行:spec_helper.rb中的require 'minitest/autorun'。添加此行以除去以下警告:

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

但是事实证明,您所需要的只是Gemfile中的gem "minitest"(即使它已经安装,作为对其他东西的依赖,并出现在Gemfile.lock中)。

答案 1 :(得分:1)

我认为问题更多来自于红宝石升级。解释器在处理块参数的方式上可能有所变化。搜索方法在代码中采用了两个参数:termoptions。但这只能通过一个参数调用:"product"

options在该块的第一行中使用options ||= {}设置为默认值,因此对于1.9.3来说,不传递选项可能不是问题,但是使用更严格的参数检查会破坏2.1.5。


一个简单的解决方法是在块参数中设置默认参数,例如

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

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

执行此操作后,您也可以安全地删除options ||= {}行。