Mocha: как добавить ожидание метода при наличии нескольких вызовов с разными параметрами
У меня есть действие контроллера Rails для тестирования. В этом действии используется метод User.can? вызывается несколько раз с различными параметрами. В одном из тестовых примеров для этого я хочу убедиться, что User.can? ('Remove') вызывается. Но мне не нужны вызовы 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" ).
Если я добавлю еще одно ожидание с параметром "депозит", тест прошел. Но мне интересно, есть ли какие-либо способы, чтобы я мог просто сосредоточиться на вызове с параметром "снять" (поскольку другие вызовы не относятся к этому тестовому примеру).
Ответы
Ответ 1
Я только что нашел обходное решение, вычеркнув вызовы с нерелевантными параметрами:
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
Ответ 2
Вы можете передать блок в with
, и этот блок будет проверять аргументы. Используя это, вы можете построить список ожидаемых вызовов:
invocations = ['withdraw', 'deposit']
User.any_instance.expects(:can?).at_most(2).with do |permission|
permission == invocations.shift
end
Каждый раз, когда вызывается can?
, Mocha переходит к блоку. Блок вытащит следующее значение из списка ожидаемых вызовов и проверит его против фактического вызова.