梅克可以模拟erlang:exit吗?

Can meck mock erlang:exit?

我想在主管模块中使用这个:

stop() ->
  exit(whereis(mousetrap_sup), kill).

所以一个简单的测试可能会这样做:

stop_invokes_exit_test() ->
  meck:new(erlang, [unstick, passthrough]),
  meck:expect(erlang, whereis, 1, a_pid),
  meck:expect(erlang, exit, 2, true),
  mousetrap_sup:stop(),
  ?assert(meck:called(erlang, exit, [a_pid, kill])).

毫不奇怪,它挂了。

我知道在哪里可能无法通过测试来执行此代码,但是有什么办法吗?

来自 meck 文档

Meck will have trouble mocking certain modules since Meck works by recompiling and reloading modules. Since Erlang have a flat module namespace, replacing a module has to be done globally in the Erlang VM. This means certain modules cannot be mocked. The following is a non-exhaustive list of modules that can either be problematic to mock or not possible at all:

  • 二郎
  • os
  • 加密
  • 编译
  • 全球

所以不,你不能模拟退出。但是,您可以将 exit 调用包装在另一个函数中并 meck 该函数。

您可以使用该名称生成一个进程,并检查退出原因:

{Pid, Ref} = spawn_monitor(timer, sleep, [infinity]),
register(my_sup, Pid),
mousetrap_sup:stop(),
receive
    {'DOWN', Ref, process, Pid, Reason} ->
        ?assertEqual(killed, Reason)
after 1000 ->
    error(not_killed)
end.