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

时间:2012-03-28 00:29:35

标签: ruby-on-rails ruby mocha

我有一个Rails控制器动作来测试。在那个动作中,一个方法User.can?使用不同的参数多次调用。在其中一个测试用例中,我想确保调用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'参数调用(因为其他调用与此测试用例无关)。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:13)

您可以将块传递给with并让该块检查参数。使用它,您可以构建预期调用列表:

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

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

答案 2 :(得分:1)

@Innerpeacer 版本的一个更简单的版本是:

User.any_instance.stubs(:can?).with(any_parameters)
User.any_instance.expects(:can?).with('withdraw')