2016-10-05 12 views
2

ソケットが終了することをテストする方法を探しています。テスト対象のコードは、これを行います。Phoenixソケットが終了したことをテストするにはどうすればよいですか?

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から適応)私のテストコードは、この行います

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 

どのようにする必要があります私はソケットの閉鎖をテストされますか?

答えて

0

はエリクサースラックチャネルを介して、良い答えを受け取りました:

は、トラップ出口信号にテストコードを修正します。ここで意図したとおりに働いて更新されたテストです:

test "logout terminates the socket", %{socket: socket} do 
    Process.flag(:trap_exit, true) 
    push socket, "logout" 
    socket_pid = socket.channel_pid 
    assert_receive {:EXIT, ^socket_pid, :logout} 
end 

注まだこれでノイズをログがコンソールのことを、私は以来、:normalに終了理由を変更した、すべてが静かです。

3

あなたは監視プロセスがダウンしたときに送信されたメッセージが{:DOWN, ref, :process, pid, reason}ので、

  1. あなたがしたい場合は、その理由:normalで終了しなければならないassert_receive

  2. で5タプルを持っている必要があります理由と一致するように: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 

あなたには、いくつかの理由ためが理由:logoutでソケットを終了したい場合は、トラップする必要があります:normal以外の理由でプロセスにリンクされているすべてのプロセスに終了信号が送信され、テストでは、テストを実行するプロセスが終了します。 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 
+0

OK、ありがとう。私は ''正常な ''が適切な理由だと判断したので、私は今のところ設定されていると思う。 – escouten

関連する問題