1

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

4

2 回答 2

0

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

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

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

instance = A.instance
def instance.get_dependency
  MockedB
end

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

于 2012-04-05T13:54:14.013 回答
0

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

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

A.class_exec do
  def get_dependency
    MockedB
  end
end

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

于 2012-04-17T18:21:13.720 回答