当您监视的进程出现故障时发送的消息是{:DOWN, ref, :process, pid, reason}
, so
你应该有一个 5 元组assert_receive
你应该终止并给出理由:normal
,如果你想匹配原因:normal
。如果这样做,您将不必捕获任何退出信号(如果您确实想退出,请参见下文:logout
).
以下对我有用:
def handle_in("logout", _payload, socket) do
{:stop, :normal, socket |> assign(:user, nil)}
end
test "...", %{socket: %{channel_pid: channel_pid} = socket} do
monitor_ref = Process.monitor(channel_pid)
push socket, "logout", %{}
assert_receive {:DOWN, ^monitor_ref, _, _, :normal}
end
如果你因为某种原因do想要退出套接字并给出原因:logout
,你还必须以除:normal
导致退出信号发送到链接到进程的所有进程,并且在测试中,运行测试的进程is链接到socket.channel_pid
。以下作品:
def handle_in("logout", _payload, socket) do
{:stop, :logout, socket |> assign(:user, nil)}
end
test "...", %{socket: %{channel_pid: channel_pid} = socket} do
Process.flag(:trap_exit, true)
monitor_ref = Process.monitor(channel_pid)
push socket, "logout", %{}
assert_receive {:DOWN, ^monitor_ref, _, _, :logout}
end