2015-10-22 44 views
2

我想这个主管模块中:可以模拟erlang:退出吗?

那么天真的测试可能做到这一点:

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])). 

毫不奇怪,它挂起。

我可以看到它可能无法在测试中执行此代码,但有没有办法?

回答

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. 
+0

这并获得成功。谢谢! –

7

从梅克文档

梅克会遇到麻烦嘲讽某些模块因为梅克作品通过重新编译和重新加载模块。由于Erlang有一个扁平模块名称空间,所以替换模块必须在Erlang虚拟机中全局完成。这意味着某些模块不能被嘲笑。以下是模块的非详尽清单,它们可以是有问题的嘲笑或者根本不可能:

  • 二郎
  • OS
  • 加密
  • 编译
  • 全球

所以不行,你不能模拟退出。但是,您可以将退出调用封装在另一个函数中,并且可以使用该函数。