使用meck使用相同的参数对同一个方法进行多次调用

Ton*_*aik 4 erlang eunit meck

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

allow(double).to receive(:msg).and_return(value1, value2, value3)
Run Code Online (Sandbox Code Playgroud)

我只能使meck存储一个带有一个返回值的方法,如下所示:

meck:expect(module, some_method, fun() -> ok end)
Run Code Online (Sandbox Code Playgroud)

有没有办法让它ok在第一次通话时返回,然后ok2在第二次通话时返回?

joh*_*hlo 5

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

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


Ada*_*erg 5

为此,您可以使用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
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)