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