2012-03-23 11 views
3

私はいくつかのプロジェクト(RSpec 1をRails 2、RSpec 2/Rails 3を使用しています)で機能有効化メカニズムを持っています。他の機能を何もすることなく、ただ一つの機能をオーバーライドするより良い方法を探しています。最終的には、特定の引数を指定して呼び出されたときにメソッドをスタブする方法を探しています。それ以外の場合は正常に動作します。閉じるRSpecのメソッドを1回の引数呼び出しでオーバーライドすることはできますか

Project::Config.should_receive(:feature_enabled?).with('new_feature').any_number_of_times.and_return(true) 
get :index # calls feature_enabled? for a few other features too 

>> <Project::Config (class)> expected feature_enabled? with 'new_feature' but received it with 'some old feature' 

作品が、私は特にさまざまな機能を有効にするさまざまなレベルでの{}ブロックの前にいくつかあるかもしれない場合には、何か少しクリーナーを探しています。

Project::Config.should_receive(:feature_enabled?).with('new_feature').any_number_of_times.and_return(true) 
# expect any other calls 
Project::Config.should_receive(:feature_enabled?).any_number_of_times 
# I can't override any features here. This is annoying if I try to set up expectations at a few different levels 
get :index # might call feature_enabled? for a few features 

また、これは失敗します。

Project::Config.stub(:feature_enabled?).with('new_feature').and_return(true) 
get :index 

>> undefined method `feature_enabled?' for Project::Config:Class 

を理想的には、私は他のfeature_enabledには影響を与えない1行で何かをすることができるだろうか?コール。 RSpec2のためにうまくいくものがあれば、ある時点で他のプロジェクトを更新する予定です。

答えて

3

私は元のメソッドは以下のようなものを作品に通じ呼び出しに見つけた最良の解決策:

method = Project::Config.method(:feature_enabled?) 

Project::Config.stub(:feature_enabled?).and_return do |arg| 
    method.call(arg) 
end 

Project::Config.should_receive(:feature_enabled?).with('new_feature').and_return(true) 
+0

恐ろしい - 私は上書きされます複数の機能を追跡するために、それぞれの実行中に少し余分な状態を保存する必要がありますしかし、これは完璧に働いています。ダニエルありがとう! –

+0

問題ありません。私はこれをきれいにする方法を常に探していますが、悲しいかな、私はまだ何も見つけていません。 –

関連する問題