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

2 に答える 2

5

RSpec Book ( http://pragprog.com/book/achbd/the-rspec-book ) は解決策を提供します:

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

... 2 番目のステートメントは、Codebreaker という名前の Ruby モジュールを宣言します。これは、仕様を実行するために必要ではありませんが、いくつかの便利さを提供します。たとえば、4 行目の Game を完全に修飾する必要はありません。

したがって、仕様をServerモジュール内に配置してみてください。HTH。

于 2013-01-22T14:57:15.037 に答える
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からのすべての定数を使用できます。これは、C++ のステートメントYour::Long::Namespaceと非常によく似ています。using namespace私の古いプロジェクトの 1 つでこれを使用する例を見ることができます:定義はこちら使用例はこちら

ただし、次のことに注意してください。

  • これは、考えられるすべての OOP 原則に違反しています。
  • すべてのオブジェクトの動作を変更すると、一部のコードはこれを予期しない場合があります。
  • C++using namespaceと同様に、これにより名前空間が乱雑になり、競合が発生する可能性があります。
  • 黙って注意を払っていない (これは良いことです) ため、このハックは非常に目立たず、議論の余地がありません (特に協力者がいる場合は非常に悪いことです)。

ほら、自己責任で使用してください:)

于 2013-01-22T16:46:31.807 に答える