2013-01-22 54 views
4

我想在命名空间来测试一些类,目前我有这样的代码:测试在特定的命名空间

describe Server::SessionController do 

    it "should create session" do 
    Server::LoginController.stub(:authenitcate).and_return(session_id) 
    Server::SessionController.... 
    Server::SessionController.... 
    end 
end 

如何摆脱重复Server命名空间?

回答

4

RSpec的书(http://pragprog.com/book/achbd/the-rspec-book)给出了解决方案:

3 module Codebreaker 
4 describe Game do 
5  describe "#start" do 

...第二个语句声明了一个名为Codebreaker.This一个Ruby模块不在 为了运行规格必要的,但它提供了一些便利。对于 例如,我们不必对行4

完全限定游戏,所以,尽量把你的规范中的一个Server模块内。 HTH。

2

虽然@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(这是非常糟糕,特别是如果你有合作者)。

你看,用您自己的风险:)

+0

我是很新的RSpec的,我书签您的把戏。我学到了'const_missing' :)谢谢。 – BernardK

+0

我很高兴它很有用:)还注意到它的兄弟'method_missing',它允许通过让对象处理实际上未定义的方法(ActiveRecord为表格字段进行处理)来编写奇妙的DSL。一些黑客也是可能的,像[这里](https://gist.github.com/4603084)你让红宝石字典的行为像Javascript的:) – NIA