9

これまでの話:

「Term」という名前のモデルを持つRailsアプリがあります。Cucumberをインストールしようとするまでは、すべて順調です。実行時に

rake cucumber

私は得る

Term is not a class (TypeError)

これは、Cucumberに別のgem「term-ansicolor」(コンソールで気の利いた色のテキスト出力を行うため)が含まれており、term-ansicolorが「Term」という名前のモジュールを定義しているために発生します。Cucumberには、Railsモデルを含める前にterm-ansicolorが含まれているため、「Term」モデルをロードするときに、「Term」はモジュールとしてすでに定義されています。最上位のモジュールとクラスは、Rubyで同じ名前を持つことはできないため、衝突が発生します。

モデルの名前を変更しないことを好み、用語-ansicolorgemにパッチを適用することにしました。これは私が思っていたよりも難しいことがわかりました。Termモジュール名を「ANSITerm」に変更しましたが、RAILS_ROOT / vendor / gems/term-ansicolorに入れた変更したgemをCucumberにロードさせる方法がわかりません。

何か案は?私は間違った木を吠えていますか?

4

3 に答える 3

4

これが私がしたことです:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

term-ansicolorとcucumberのソースをgithubからダウンロード
検索term-ansicolorsourcefor "module Term"and replace "module ANSITerm"
for Search cucumber source for "include Term"and replace with "include ANSITerm"
Search cucumber source for "::Term"and replace with"::ANSITerm"

sudo gem install term-ansicolorローカルリポジトリ
sudo gem install cucumberから ローカルリポジトリから

これで、維持する2つのgemがありますが、アプリですべてのモデル参照を変更するよりも簡単なようです。

コメント/提案を歓迎します。

于 2009-11-16T03:50:57.200 に答える
3

2つの解決策:

1)アプリの用語モデルを別のものに変更します。

2)パッチterm-ansicolorで名前空間化されたTermを使用し、代わりにそのgemを使用します。

于 2009-11-15T06:45:01.433 に答える
3

仕様のアプリケーションモデルNodeおよびCapybara::Nodeと名前空間の衝突が発生しました。問題を修正するには、仕様でトップレベルの名前空間を明示的に指定するだけで十分でした。

it "should find the specified node scoped under the current user" do
  ::Node.should have_received(:find_by_id_for_user).with(node.id, user)
end
于 2010-11-17T19:52:04.290 に答える