15

テストする 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') の予期しない呼び出しを示すメッセージが表示され、テストは失敗しました。パラメータ「deposit」を使用して別の期待値を追加すると、テストに合格しました。しかし、「withdraw」パラメーターを使用した呼び出しに集中できる方法があるかどうか疑問に思っています (他の呼び出しはこのテスト ケースとは無関係であるため)。

4

3 に答える 3

19

無関係なパラメーターを使用して呼び出しをスタブ化することにより、回避策を見つけました。

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

于 2012-03-28T04:52:57.877 に答える