虽然@BernardK给出了适用于大多数情况的“正确的”解决方案,但也有一个肮脏的HACK。如果你有很多不同的Spec文件测试来自同一个命名空间的不同类,并且厌倦了在每个文件中编写module Your::Long::Namespace ... end
并引入额外的标识级别(因为这可能会导致VCS中的巨大差异)。
所以,如果你把这个...
def Object.const_missing(c)
if Your::Long::Namespace.const_defined? c
Your::Long::Namespace.const_get(c)
else
raise NameError, "uninitialized constant #{c}"
end
end
...在你spec_helper.rb
,然后使用这个帮手,你将能够使用所有的常量从Your::Long::Namespace
每一个规格(类常量太)没有前缀,也不需要把你的规格放在这个模块中。这非常类似于C++的using namespace
声明。你可以在我的一个旧项目中看到一个例子:definition here,usage example here。
但要注意的是:
- 这违反了所有可以想象的OOP原则;
- 你修改的行为全部对象,有些代码可能不会期望这个;
- 与C++
using namespace
一样,这会导致命名空间混乱和可能的冲突;
- 保持沉默,并没有服用注意(这是好),这个技巧是非常不明显和undebugabble(这是非常糟糕,特别是如果你有合作者)。
你看,用您自己的风险:)
来源
2013-01-22 16:46:31
NIA
我是很新的RSpec的,我书签您的把戏。我学到了'const_missing' :)谢谢。 – BernardK
我很高兴它很有用:)还注意到它的兄弟'method_missing',它允许通过让对象处理实际上未定义的方法(ActiveRecord为表格字段进行处理)来编写奇妙的DSL。一些黑客也是可能的,像[这里](https://gist.github.com/4603084)你让红宝石字典的行为像Javascript的:) – NIA