【问题标题】:Can't modify frozen Array error when running rspec运行 rspec 时无法修改冻结的数组错误
【发布时间】:2017-11-03 17:21:25
【问题描述】:

一直在将 Rails 引擎升级到 Rails 5.1,现在正在让 rspec 测试恢复工作。

我有一个控制器,在那个控制器中我有以下内容:

module Users
  class SessionsController < Devise::SessionsController
    skip_before_action :authenticate_user!
    skip_before_action :authorize_user!

    def create
      super
      flash[:analytics] = { "data-analytics-form-completed-name" => "#{StewardshipUser.app_slug}/sign-in", "data-analytics-form-completed-type" => "login" }
    end

    def repopulate_email
      (params[:user] && params[:user][:email]) ? params[:user][:email] : ''
    end
    helper_method :repopulate_email
  end
end

如果我删除 skip_before_action :authorize_user!,测试会运行,但并非全部成功。

我收到以下错误:

An error occurred while loading ./spec/validators/rfc_compliant_validator_spec.rb.
Failure/Error: Dummy::Application.initialize!

RuntimeError:
  can't modify frozen Array
# /Users/ahcarpenter/.rvm/gems/ruby-2.2.2/gems/railties-5.1.4/lib/rails/engine.rb:579:in `unshift'
# /Users/ahcarpenter/.rvm/gems/ruby-2.2.2/gems/railties-5.1.4/lib/rails/engine.rb:579:in `block in <class:Engine>'

关于为什么初始化程序会因那里的那一行而崩溃的任何想法?

此外,当我最初去重新初始化 rspec 时,我不得不注释掉该方法以使初始化程序运行,因为由于某种原因它不再被发现(我似乎没有增加任何 gem 版本包含该方法,但也许是这样)

【问题讨论】:

  • 你能分享你的测试代码吗?我假设的一件事是,在您的测试中,您没有登录用户,这会以某种方式导致失败。另外,authorize_user! 函数来自哪里?你在使用pundit 或类似的东西吗?
  • 我在 5.0.1、Rails 5.1 和 master 分支中都遇到了同样的错误。这似乎与第三方引擎中路由的定义有关。提示是另一个失败的规范Missing :action key on routes definition, please check your routes.

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


【解决方案1】:

我确定您现在已经解决了这个问题,但是我遇到了这个错误,我意识到我的测试数据库没有正确初始化。我通过运行以下命令修复了错误:

rails db:migrate RAILS_ENV=test

我希望这对偶然发现这篇文章的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 2021-02-19
    • 1970-01-01
    • 2011-11-04
    • 2013-06-24
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多