使用 meck 多次调用具有相同参数的相同方法

Using meck to make multiple calls to the same method with the same arguments

我知道使用 ruby/rspec,您可以执行类似以下操作,以便为对方法的不同调用接收不同的 return 值:

allow(double).to receive(:msg).and_return(value1, value2, value3)

我只能用一个 return 值使 meck 存根成为一种方法,如下所示:

meck:expect(module, some_method, fun() -> ok end)

有没有办法让第一次调用 return ok,然后第二次调用 ok2

您可以通过在第一次调用时重新定义 expectaction 函数来做到这一点:

meck:expect(module,
            some_method, 
            fun() ->
                     %% Redefine the expect fun for next invocation
                     meck:expect(module,
                                 some_method,
                                 fun() ->
                                          ok2 
                                 end),
                     ok
            end).

为此,您可以使用 Meck 中的两个快捷方式:

  • meck:sequence/4 这个函数returns一个序列中的每个元素,直到最后一个元素。然后,无限返回最后一个元素。

    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 这个函数 returns 每个元素都在一个循环中。当返回最后一个元素时,它从第一个元素开始。

    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