【问题标题】:`load_missing_constant': uninitialized constant AuthenticatedTestHelper (NameError)`load_missing_constant':未初始化的常量 AuthenticatedTestHelper (NameError)
【发布时间】:2012-12-21 17:44:11
【问题描述】:

我有一个旧的 Rails 项目需要更改甚至更新。

我的宝石列表如下所示:

*** LOCAL GEMS ***

actionmailer (2.3.14, 2.3.11, 2.3.8, 2.3.5, 2.3.2)
actionpack (2.3.14, 2.3.11, 2.3.8, 2.3.5, 2.3.2)
activerecord (2.3.14, 2.3.11, 2.3.8, 2.3.5, 2.3.2)
activeresource (2.3.14, 2.3.11, 2.3.8, 2.3.5, 2.3.2)
activesupport (3.2.9, 2.3.14, 2.3.11, 2.3.8, 2.3.5, 2.3.2)
addressable (2.3.2)
BlueCloth (1.0.1)
bourne (1.1.2)
bundler (1.2.3)
childprocess (0.3.6)
ffi (1.2.0)
i18n (0.6.1)
json (1.7.5)
libwebsocket (0.1.7.1)
metaclass (0.0.1)
mocha (0.10.5)
multi_json (1.5.0)
mysql (2.8.1)
paperclip (2.3.1.1)
rack (1.1.3, 1.0.1)
rails (2.3.14, 2.3.2)
rake (0.8.7)
rdoc (3.12)
restful_authentication (1.1.6)
rspec (1.3.1)
ruby-net-ldap (0.0.4)
rubygems-bundler (1.1.0)
rubyzip (0.9.9)
rvm (1.11.3.5)
selenium-client (1.2.18)
selenium-webdriver (2.27.2)
shoulda (2.11.3)
shoulda-context (1.0.2)
shoulda-matchers (1.4.2)
thoughtbot-shoulda (2.11.1)
websocket (1.0.6)

当我运行rake test 时,我得到:

/Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:469:in `load_missing_constant': uninitialized constant AuthenticatedTestHelper (NameError)
    from /Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing'
    from /Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:118:in `const_missing'
    from ./test/test_helper.rb:4
    from ./test/functional/admin/articles_controller_test.rb:1:in `require'
    from ./test/functional/admin/articles_controller_test.rb:1
    from /Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `load'
    from /Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5
    from /Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `each'
    from /Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5
/Users/noah/.rvm/rubies/ruby-1.8.7-p371/bin/ruby -I"lib:test" "/Users/noah/.rvm/gems/ruby-1.8.7-p371@website/gems/rake-0.8.7/lib/rake/rake_test_loader.rb"  
Errors running test:units and test:functionals!

这是我的测试助手的第一部分:

ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'
include AuthenticatedTestHelper

任何包含include AuthenticatedTestHelper 的地方都会失败。关于为什么会这样的任何想法?

更新:

我认为我的问题是 restful_authentication 无法生成提供 AuthenticatedTestHelper 的文件。

在依赖项中,我有以下内容:

qualified_name = qualified_name_for from_mod, const_name
      path_suffix = qualified_name.underscore
      name_error = NameError.new("uninitialized constant #{qualified_name}")

      file_path = search_for_file(path_suffix)
      if file_path && ! loaded.include?(File.expand_path(file_path)) # We found a matching file to load
        require_or_load file_path
        raise LoadError, "Expected #{file_path} to define #{qualified_name}" unless uninherited_const_defined?(from_mod, const_name)
        return from_mod.const_get(const_name)
      elsif mod = autoload_module!(from_mod, const_name, qualified_name, path_suffix)
        return mod
      elsif (parent = from_mod.parent) && parent != from_mod &&
            ! from_mod.parents.any? { |p| uninherited_const_defined?(p, const_name) }
        # If our parents do not have a constant named +const_name+ then we are free
        # to attempt to load upwards. If they do have such a constant, then this
        # const_missing must be due to from_mod::const_name, which should not
        # return constants from from_mod's parents.
        begin
          return parent.const_missing(const_name)
        rescue NameError => e
          raise unless e.missing_name? qualified_name_for(parent, const_name)
          raise name_error
        end
      else
        puts file_path #added this line
        raise name_error
      end
    end

并且我已经添加了 puts file_path 行,这是 nil,所以 rails 也不知道这个文件在哪里。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-2


    【解决方案1】:

    通常这个模块应该在lib/authenticated_test_helper.rb

    如果您找不到它或在其他地方找不到它,您可以简单地在该文件中创建一个空模块,然后逐步实现或存根它。

    但是,如果您打算升级到 Rails 3,则无论如何都必须选择另一个身份验证框架(Authlogic、Devise),因为 restful_authentication 似乎不适用于 Rails 3。

    PS:dependencies.rb 的代码对您没有帮助。它只包含从常量派生文件名的代码(在您的情况下为模块)它只是失败了,因为您的加载路径中没有名为 authenticated_test_helper 的文件。

    【讨论】:

    • 我能够在 github 上找到该文件的副本并将其放入我的测试中。这允许测试实际运行,但有些失败。我将不得不更深入地研究这一点。感谢您对 restful_authentication 的提醒。我忘记了 Rails 3 的不兼容性。可能是以前的开发者没有升级它的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多