梅克可以模拟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.
我想在主管模块中使用这个:
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.