可以meck模拟erlang:退出?

Don*_*son 2 erlang meck

我想在一个主管模块中这个:

stop() ->
  exit(whereis(mousetrap_sup), kill).
Run Code Online (Sandbox Code Playgroud)

所以天真的测试可能会这样做:

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])).
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,它挂起了.

我可以看到在测试中运行此代码可能无法实现的地方,但是有办法吗?

Cod*_*oll 7

从meck文档

由于Meck通过重新编译和重新加载模块来工作,Meck将无法模拟某些模块.由于Erlang具有平面模块命名空间,因此必须在Erlang VM中全局替换模块.这意味着某些模块不能被模拟.以下是一个非详尽的模块列表,这些模块可能对模拟有问题或根本不可能:

  • 二郎神
  • 加密
  • 全球

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