【问题标题】:Subclassed model results in NameError in development environment but not in test子类化模型在开发环境中导致 NameError 但在测试中没有
【发布时间】:2009-03-26 21:03:03
【问题描述】:

这是我的动作模型:

class Action < ActiveRecord::Base
end

class Fold < Action
end

class Check < Action
end

class Call < Action
end

class Bet < Action
end

在另一个模型中,我有这个

class Deal < ActiveRecord::Base
  def Deal.parse_action(action_string)
    case action_string
    when "folds":   Fold.new()
    when "checks":  Check.new()
    when "calls":   Call.new()
    when "bets":    Bet.new()
    when "raises":  Bet.new()
    else nil   
    end
  end
  # ...
end

现在,当我对此进行测试时,如果这在我的单元测试中有效,那么一切似乎都有效。但是一旦我在开发模式下启动 web 服务器,我就会得到这个:

NameError(未初始化的常量 Deal::Fold): app/models/deal.rb:115:in `parse_action' ...

为什么它认为 Fold 存在于命名空间 Deal 中?为什么在测试环境中不会发生这种情况?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    并不是说Fold 存在于Deal 命名空间中,而是说它正在寻找常量Fold,并且它当前位于Deal 中。例如,试试这个:

    class Foo 
      def test; puts Bar; end
    end
    Foo.new.test
    

    你会得到这个:

    NameError: uninitialized constant Foo::Bar
      from (irb):3:in `test'
      from (irb):7
      from :0
    

    Rails 有一些东西可以为你自动加载常量,我猜问题是你自己的文件中没有 Fold 类。尝试将Fold 类定义放入它自己的文件——app/models/fold.rb,看看是否有帮助。如果是这样,请尝试将其放回 action.rb 文件中,然后在执行 case 语句之前执行一些会导致加载 Action 文件的操作,例如在 case 语句之前的 x = Action。如果可行,那么您需要在deal.rb 中输入require "action.rb",因为问题是您的测试代码正在加载action.rb(可能通过其他一些测试),但您的生产代码没有。

    【讨论】:

    • 您可能只需要在 deal.rb 中执行操作。
    【解决方案2】:

    我在工作中不使用 Rails,但有时我会遇到这样的场景:在运行测试时知道某个类,但在运行可执行文件时却没有。发生这种情况是因为我的测试文件中有相关文件的必要“require”语句,但我没有时间将必要的“require”语句放入生产代码中。

    【讨论】:

    • 这对我有用。我只需要在 Deal 模型中“要求”“action.rb”。
    【解决方案3】:

    在 Ruby 中向您声明的类添加方法:

      class Deal < ActiveRecord::Base
        def self.parse_action(action_string)
          case action_string
            when "folds":   Fold.new
            ....
    

    这也可能是您问题的根源。

    同样(抱歉,挑剔),但您不需要 Fold.new 上的括号。您可以在不使用 parathesis 的情况下将参数传递给方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2011-01-09
    • 2022-10-15
    • 2019-10-31
    • 2019-04-14
    相关资源
    最近更新 更多