Ruby on rails Mocha:当有多个使用不同参数的调用时,如何添加对方法的期望

Ruby on rails Mocha:当有多个使用不同参数的调用时,如何添加对方法的期望,ruby-on-rails,ruby,ruby-mocha,Ruby On Rails,Ruby,Ruby Mocha,我有一个Rails控制器动作要测试。在该操作中,方法User.can?使用不同的参数多次调用。在它的一个测试用例中,我希望确保调用User.can?('draw')。但我不关心User.can的调用?使用其他参数 def action_to_be_tested ... @user.can?('withdraw') ... @user.can?('deposit') ... end 我在测试中尝试了以下内容: User.any_instance.expects(:can?).

我有一个Rails控制器动作要测试。在该操作中,方法User.can?使用不同的参数多次调用。在它的一个测试用例中,我希望确保调用User.can?('draw')。但我不关心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'添加另一个期望值,则测试通过。但是我想知道是否有任何方法可以让我只关注带有'draw'参数的调用(因为其他调用与此测试用例无关)。

我刚刚找到了一个解决方法,通过删除带有不相关参数的调用:

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

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

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

每次调用
can?
,摩卡都会屈服于区块。该块将从预期调用列表中提取下一个值,并对照实际调用进行检查。

来自@innerpaicer version的更简单版本是:

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

我知道支持的文本值(与变量的直接比较)或是屈服于块,但我不确定
not(…)
构造来自何处。你能说得更详细些吗?@Pysis
Not()
来自与
with()
一起使用的。它们可以是骆驼形的
HasKey()
或蛇形的
has\u key()
<代码>不是
必须是驼峰式的,因为它是一个关键字。这应该是正确的答案,因为它完全符合我的要求。不管怎样,这对我都不起作用。不过,下面的答案很有效。