【问题标题】:Modifying a ruby class doesn't work as expected when running Spork运行 Spork 时,修改 ruby​​ 类无法按预期工作
【发布时间】:2012-04-18 13:50:29
【问题描述】:

我的 Rails 应用程序中有一个普通的 Ruby 类,我正在测试环境中重新打开它。它基本上看起来像

class A
  def get_dependency
    B
  end
  ... some other methods ...
end

在我的黄瓜测试环境中(在从 features/env.rb 加载的文件中)(以及 rspec 的类似位置)我这样做

class A
  def get_dependency
    MockedB
  end
end

这在正常运行中运行良好,但是当我运行 Spork 时,它会奇怪地失败。 A 类的 get_dependency 方法被正确覆盖,但它的所有其他公共方法现在都丢失了。有任何想法吗?

我假设这与加载顺序有关,但是当我将文件的要求移出 Spork 的预加载部分时,我没有得到任何更改。

【问题讨论】:

    标签: ruby-on-rails rspec cucumber spork


    【解决方案1】:

    这不是一个很好的答案,但它是一种解决方法。我没有重新打开课程,而是修改了一个单例实例。代码基本一样,只是我在A上加了一个实例方法:

    class A
      def instance
        @@instance ||= A.new
      end
    end
    

    然后在我的测试代码中我修改了实例

    instance = A.instance
    def instance.get_dependency
      MockedB
    end
    

    我只需要确保我的实际代码始终调用 A.instance 而不是 A.new。

    【讨论】:

      【解决方案2】:

      一种可能的情况是A 设置为自动加载,但是当您在黄瓜环境中为其定义覆盖时,您会在它自动加载之前执行此操作;由于A 现在存在,它永远不会自动加载。

      一个可能的解决方案是在覆盖方法之前调用自动加载器:

      A.class_exec do
        def get_dependency
          MockedB
        end
      end
      

      如果此时无法自动加载A(可能尚未设置自动加载器),它将引发ConstMissing

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-05
        相关资源
        最近更新 更多