我想在一个主管模块中这个:
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)
毫不奇怪,它挂起了.
我可以看到在测试中运行此代码可能无法实现的地方,但是有办法吗?
从meck文档
由于Meck通过重新编译和重新加载模块来工作,Meck将无法模拟某些模块.由于Erlang具有平面模块命名空间,因此必须在Erlang VM中全局替换模块.这意味着某些模块不能被模拟.以下是一个非详尽的模块列表,这些模块可能对模拟有问题或根本不可能:
所以不,你不能模拟退出.但是,您可以将退出调用包装在另一个函数中并修复该函数.