Мокко: Как добавить ожидание метода, когда есть несколько вызовов с различными параметрами - PullRequest
15 голосов
/ 28 марта 2012

У меня есть действие контроллера Rails для тестирования. В этом действии метод User.can? вызывается несколько раз с разными параметрами. В одном из тестов для этого я хочу убедиться, что User.can? ('Вывести') вызывается. Но мне наплевать на вызовы 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, тест пройден. Но мне интересно, есть ли какие-нибудь способы, чтобы я мог просто сосредоточиться на вызове с параметром 'изъятия' (потому что другие вызовы не имеют отношения к этому тестовому случаю).

Ответы [ 2 ]

15 голосов
/ 28 марта 2012

Я только что нашел обходной путь, заглушив вызовы с нерелевантными параметрами:

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

14 голосов
/ 19 марта 2014

Вы можете передать блок на with и заставить этот блок проверять аргументы.Используя это, вы можете создать список ожидаемых вызовов:

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

Каждый раз, когда вызывается can?, Мокко уступает блоку.Блок извлекает следующее значение из списка ожидаемых вызовов и сравнивает его с фактическим вызовом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...