Mocha:当存在多个具有不同参数的调用时,如何添加方法的期望

Inn*_*cer 15 ruby ruby-on-rails mocha.js

我有一个Rails控制器动作来测试.在那个动作中,一个方法User.can?使用不同的参数多次调用.在其中一个测试用例中,我想确保调用User.can?('withdraw').但是我不关心User.can的调用?与其他参数.

def action_to_be_tested
  ...
  @user.can?('withdraw')
  ...
  @user.can?('deposit')
  ...
end
Run Code Online (Sandbox Code Playgroud)

我在下面尝试了测试:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true)
Run Code Online (Sandbox Code Playgroud)

但测试失败,并显示消息指示User.can的意外调用?('deposit').如果我用参数'deposit'添加另一个期望值,则测试通过.但我想知道是否有任何方法,我可以专注于'withdraw'参数调用(因为其他调用与此测试用例无关).

Eri*_*all 17

您可以传递一个块with并让该块检查参数.使用它,您可以构建预期调用的列表:

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

每次can?调用时,Mocha将屈服于该块.该块将从预期调用列表中提取下一个值,并根据实际调用进行检查.

  • 这应该是正确的答案,因为它完全符合要求。 (2认同)

Inn*_*cer 16

我刚刚找到了一个解决方法,通过使用不相关的参数来调用调用:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true)
User.any_instance.stubs(:can?).with(Not(equals('withdraw')))
Run Code Online (Sandbox Code Playgroud)

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