2012-03-28 6 views
13

私がテストするためのRailsのコントローラのアクションを持っているとの複数の呼び出しがある方法の期待を追加する方法。そのアクションで、メソッドUser.can?異なるパラメータで複数回呼び出されます。そのテストケースの1つでは、User.can?( 'withdraw')が呼び出されていることを確認したいと思います。しかし、私はUser.canの呼び出しについては気にしませんか?他のパラメータとともに使用します。モカ:異なるパラメータ

def action_to_be_tested 
    ... 
    @user.can?('withdraw') 
    ... 
    @user.can?('deposit') 
    ... 
end 

私がテストしてみました以下:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 

しかし、テストはUser.canの予想外の呼び出しを示すメッセージで失敗しました( '預金')?。 パラメータ 'deposit'を使用して別の期待値を追加すると、テストは合格になります。しかし、私は、(他の呼び出しはこのテストケースに無関係であるため)「withdraw」パラメータで呼び出しに集中できるような方法があるかどうかは疑問です。

答えて

15

私は無関係なパラメータで呼び出しを行うスタブによって、回避策を見つけた:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 
User.any_instance.stubs(:can?).with(Not(equals('withdraw'))) 

http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000023

+0

Iは、[API](http://gofreerange.com/mocha/docs/Mocha/Expectation.html#with-instance_method)がリテラル値(変数への直接比較を)サポートされている、またはブロックに得認識していたが、私は 'Not(...) '構造体がどこから来るのか分かりません。それについてもっと詳しく話すことができますか? – Pysis

+0

@Pysis 'ないが()' '')(と一緒に使用されている[モカ:: ParameterMatchers](http://gofreerange.com/mocha/docs/Mocha/ParameterMatchers.html)から来ています。彼らは ')(has_key'等HasKey() 'またはヘビ場合'のようなキャメルケースとすることができます。 'Not'は、それはしかし、キーワードだからキャメルケースである必要があります。 –

12

あなたはwithにブロックを渡し、そのブロックは、引数を調べることができます。

invocations = ['withdraw', 'deposit'] 
User.any_instance.expects(:can?).at_most(2).with do |permission| 
    permission == invocations.shift 
end 

can?が呼び出されるたびに、モカはブロックに得られます:その使用して、予想される呼び出しのリストを構築することができます。ブロックは、期待される呼び出しのリストから次の値を引き出し、実際の呼び出しに対してそれをチェックします。

関連する問題