Подтвердить что ты не робот

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" ). Если я добавлю еще одно ожидание с параметром "депозит", тест прошел. Но мне интересно, есть ли какие-либо способы, чтобы я мог просто сосредоточиться на вызове с параметром "снять" (поскольку другие вызовы не относятся к этому тестовому примеру).

4b9b3361

Ответ 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 переходит к блоку. Блок вытащит следующее значение из списка ожидаемых вызовов и проверит его против фактического вызова.