Использование meck для нескольких вызовов одного и того же метода с одинаковыми аргументами
Я знаю, что в ruby вы можете сделать что-то вроде следующего, чтобы получить разные возвращаемые значения для разных вызовов метода:
allow(double).to receive(:msg).and_return(value1, value2, value3)
Я только смог сделать meck-заглушку методом с одним возвращаемым значением, вот так:
meck:expect(module, some_method, fun() -> ok end)
Есть ли способ заставить его вернуться ok
на первый звонок, а затем ok2
На втором?
2 ответа
Решение
Для этого в Meck есть два ярлыка, которые вы можете использовать:
meck:sequence/4
Эта функция возвращает каждый элемент в последовательности до последнего элемента. Затем последний элемент возвращается на неопределенный срок.6> meck:sequence(module, some_method, 0, [ok, ok2]). ok 7> module:some_method(). ok 8> module:some_method(). ok2 9> module:some_method(). ok2
meck:loop/4
Эта функция возвращает каждый элемент в цикле. Когда последний элемент возвращается, он начинается с первого.10> meck:loop(module, some_method, 0, [ok, ok2]). ok 11> module:some_method(). ok 12> module:some_method(). ok2 13> module:some_method(). ok
Вы можете сделать это, переопределив функцию ожидания при первом вызове:
meck:expect(module,
some_method,
fun() ->
%% Redefine the expect fun for next invocation
meck:expect(module,
some_method,
fun() ->
ok2
end),
ok
end).