@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
と同様に、これにより名前空間が乱雑になり、競合が発生する可能性があります。
- 黙って注意を払っていない (これは良いことです) ため、このハックは非常に目立たず、議論の余地がありません (特に協力者がいる場合は非常に悪いことです)。
ほら、自己責任で使用してください:)