运行Spork时,修改ruby类不能按预期工作

时间:2012-04-04 19:43:32

标签: ruby-on-rails rspec cucumber spork

我在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的预加载部分时,我没有得到任何更改。

2 个答案:

答案 0 :(得分:0)

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

上添加了一个实例方法
class A
  def instance
    @@instance ||= A.new
  end
end

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

instance = A.instance
def instance.get_dependency
  MockedB
end

我必须确保我的实际代码总是调用A.instance而不是A.new。

答案 1 :(得分:0)

一种可能的情况是A设置为自动加载,但是当你在黄瓜环境中为它定义覆盖时,你会在自动加载之前这样做;由于A现在存在,它永远不会被自动加载。

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

A.class_exec do
  def get_dependency
    MockedB
  end
end

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