如何测试 Phoenix 套接字是否已终止?

2024-03-22

我正在寻找一种方法来测试套接字是否被终止。被测试的代码执行以下操作:

def handle_in("logout", _payload, socket) do
  {:stop, :logout, socket |> assign(:user, nil)}
end

和我的测试代码(改编自http://elixir-lang.org/getting-started/try-catch-and-rescue.html#exits http://elixir-lang.org/getting-started/try-catch-and-rescue.html#exits) 做这个:

test "logout terminates the socket", %{socket: socket} do
  try do
    push socket, "logout"
  catch
    huh -> IO.puts("Caught something #{IO.inspect huh}")
    :exit, what -> IO.puts("Caught :exit #{IO.inspect what}")
  end
  assert_receive {:DOWN, monitor_ref, _, :normal}
end

但是当我运行测试时,我得到这个:

1) test logout without login terminates the socket (Main.AuthChannelTest)
   test/channels/auth_channel_test.exs:47
   ** (EXIT from #PID<0.505.0>) :logout

.....09:06:41.139 [error] GenServer #PID<0.507.0> terminating
** (stop) :logout

How should我正在测试套接字关闭?


当您监视的进程出现故障时发送的消息是{:DOWN, ref, :process, pid, reason}, so

  1. 你应该有一个 5 元组assert_receive

  2. 你应该终止并给出理由: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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试 Phoenix 套接字是否已终止? 的相关文章

随机推荐