【问题标题】:Failing to run RSpec (uninitialized constant User (NameError)无法运行 RSpec(未初始化的常量 User (NameError)
【发布时间】:2014-08-13 15:30:03
【问题描述】:

尝试运行 bundle exec rspec spec/models/user_spec.rb 但未能执行(请参阅下面的错误)。

user_spec.rb 的内容:

require 'rails_helper'

describe User do
  pending "add some examples to (or delete) #{__FILE__}"
end

如果我删除最后 3 行,那么它会包含 0 个示例和 0 个失败。但是,当最后 3 行出现时,会产生错误

/spec/models/user_spec.rb:4:in `<top (required)>': uninitialized constant User (NameError)
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/configuration.rb:1057:in `load'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/configuration.rb:1057:in `block in load_spec_files'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/configuration.rb:1057:in `each'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/configuration.rb:1057:in `load_spec_files'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/runner.rb:97:in `setup'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/runner.rb:85:in `run'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/runner.rb:70:in `run'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/lib/rspec/core/runner.rb:38:in `invoke'
    from /var/lib/gems/1.9.1/gems/rspec-core-3.0.3/exe/rspec:4:in `<top (required)>'
    from /usr/local/bin/rspec:23:in `load'
    from /usr/local/bin/rspec:23:in `<main>'

它似乎不知道 User 是什么并将其视为一个常量,而这实际上是一个模型。我已经在 ruby​​ 沙箱中验证了我可以在数据库中创建新用户。有什么想法吗?


回答: 从 .rspec 中删除 --warnings 后(谢谢 kirti),当前错误是关于 capybara 版本太低(需要 2.2)。安装最新版本(修改 gemfile 和 bundle install)后,rspec 似乎正在正确执行。谢谢大家的cmets。

【问题讨论】:

  • 向我们展示您的用户模型
  • 我想你确实有一个文件app/models/user.rb 里面有User 类?
  • 是的 app/models/user.rb 包含一个空类:class User
  • 只是一个术语说明:“模型”是 Rails 用于继承自类 ActiveRecord::Base 的 Ruby 类的词。 Ruby 中所有以大写字母开头的变量都是常量,因此当您引用User 时,Ruby 会查找具有该名称的常量。也就是说,class User &lt; ActiveRecord::Base 创建了一个作为 Rails 模型的 Ruby 类,并将其分配给常量 User
  • 至于你的实际问题:spec_helper.rb的内容是什么?您是否有确实运行的其他模型的规格?

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


【解决方案1】:

我遇到了同样的问题,这是因为 rspec/rails_helper.rb 没有在任何地方被调用。

我将它添加到.rspec 文件中,所以我的文件如下所示

--color
--require spec_helper
--require rails_helper

这并在spec/spec_helper.rb 中为 false 添加警告为我解决了这个问题!

  config.warnings = false

【讨论】:

    【解决方案2】:

    从 .rspec 中删除 --warnings 后(感谢 kirti),当前错误是关于 capybara 版本太低(需要 2.2)。安装最新版本(修改 gemfile 和 bundle install)后,rspec 似乎正在正确执行。谢谢大家的cmets。

    【讨论】:

      【解决方案3】:

      对我来说,问题是由于该类位于另一个命名空间中,因此未正确调用该类的名称。例如,我有:

      RSpec.describe User do
      
        # ... some tests
      
      end
      

      我应该有的地方

      RSpec.describe MyModule::User do
      
        # ... some tests
      
      end
      

      因为用户类是用MyModule 模块定义的。

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2016-09-19
        • 1970-01-01
        相关资源
        最近更新 更多