Использование 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).
Другие вопросы по тегам