停止Erlang主管?

Rog*_*mbe 5 erlang

我正在尝试测试一个包含主管和两个(不同)工作人员的应用程序.我正在使用eunit,所以在我的设置和清理中,我有:

setup() ->
    {ok, Pid} = foo_sup:start_link(),
    Pid.

cleanup(Pid) ->
    exit(Pid, kill).
Run Code Online (Sandbox Code Playgroud)

foo_sup:start_link/0 定义为:

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
Run Code Online (Sandbox Code Playgroud)

但是,当我的测试运行时,我得到了{badmatch,{error,{already_started,<0.188.0>}}},这意味着我的主管仍在运行.

我如何能:

  1. 发信号通知主管停止自己及其所有孩子?
  2. 等待完成?

leg*_*cia 7

  1. 发送shutdown信号使主管杀死其子女并退出:

    exit(Pid, shutdown).
    
    Run Code Online (Sandbox Code Playgroud)

    您可能必须首先取消测试过程与测试的关联.

  2. 监视进程,等待它退出:

    Ref = monitor(process, Pid),
    receive
        {'DOWN', Ref, process, Pid, _Reason} ->
            ok
    after 1000 ->
            error(exit_timeout)
    end.
    
    Run Code Online (Sandbox Code Playgroud)

  • 而不是"关闭",使用"正常",因此它也不会降低测试过程. (2认同)