我想在主管模块中使用它:
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])).
毫不奇怪,它挂了。
我可以看到可能无法通过测试来运用此代码,但有没有办法?
答案 0 :(得分:7)
来自meck文档
由于Meck通过重新编译和重新加载模块工作,Meck将无法模拟某些模块。由于Erlang具有平面模块命名空间,因此必须在Erlang VM中全局替换模块。这意味着某些模块不能被模拟。以下是一个非详尽的模块列表,这些模块可能有问题,无论是模拟还是根本不可能:
所以不,你不能嘲笑退出。但是,您可以将退出调用包装在另一个函数中并修复该函数。
答案 1 :(得分:4)
您可以使用该名称生成进程,并检查退出原因:
{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.