Erlang 梅克可以模拟厄尔朗:退出吗?
我希望在主管模块中使用此选项:Erlang 梅克可以模拟厄尔朗:退出吗?,erlang,meck,Erlang,Meck,我希望在主管模块中使用此选项: 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), mouse
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将很难模拟某些模块,因为Meck通过重新编译和重新加载模块来工作。由于Erlang有一个扁平的模块名称空间,因此必须在Erlang VM中全局地替换模块。这意味着某些模块无法模拟。以下是一个非详尽的模块列表,这些模块可能存在模拟问题,也可能根本不可能:
- 二郎
- 操作系统
- 加密
- 编撰
- 全球的
所以不,你不能假装退出。但是,您可以将退出调用包装到另一个函数中,然后调用该函数。您可以使用该名称生成一个进程,并检查退出原因:
{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.