我有一个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'参数调用(因为其他调用与此测试用例无关)。
答案 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')