Как протестировать канал с помощью Phoenix.ChannelTest.close/2

У меня есть тест, который запускает сокетное соединение, подписывается и присоединяется к теме. Затем я отправляю сообщение в канал, который выполняет некоторую работу и сохраняет некоторые данные. Затем я использую ChannelTest.close/2 в сокете, который имитирует закрытие клиентом соединения. Затем я хотел бы изменить обработанные данные и создать другое соединение сокета, чтобы проверить некоторое поведение.

Моя проблема заключается в том, что ChannelTest.close/2 приводит к сбою моего теста и возвращает ** (EXIT from #PID<0.558.0>) shutdown: :closed. Как я могу предотвратить это?

Вот соответствующий код

defmodule PlexServer.EmpireChannelTest do  

  use PlexServer.ChannelCase

  alias PlexServer.EmpireChannel
  alias PlexServer.EmpireTemplate
  alias PlexServer.EmpireInstance

  setup do
    ...

    {:ok, _, socket} =
      socket("user_id", %{})
      |> subscribe_and_join(EmpireChannel,
        "empire:#{empire.id}",
        %{"guardian_token" => jwt})

    {:ok, socket: socket, empire: empire, jwt: jwt}
  end

  test "research infrastructure", %{socket: socket, empire: empire, jwt: jwt} do
    ...

    ref = push socket, "command", request
    assert_reply ref, :ok, _, 1000

    close(socket) #fails here

    ...
  end
end

defmodule PlexServer.UserSocket do
  use Phoenix.Socket
  use Guardian.Phoenix.Socket

  ## Channels
  # channel "rooms:*", PlexServer.RoomChannel
  channel "empire:*", PlexServer.EmpireChannel
  channel "user:*", PlexServer.UserChannel

  ## Transports
  transport :websocket, Phoenix.Transports.WebSocket

  def connect(_params,_) do
    :error
  end

  def id(_socket), do: nil
end


defmodule PlexServer.EmpireChannel do
  use PlexServer.Web, :channel
  use Guardian.Channel

  alias PlexServer.EmpireInstance
  alias PlexServer.EmpireServer

  ...

  def join("empire:" <> empire_id, %{claims: _claims, resource: user}, socket) do
    ...
    #Starts a process through a supervisor here
  end

  def join("empire:" <> _, _, _socket) do
    {:error, data_error(:auth, "not authorized, did you pass your jwt?")}
  end

  # Channels can be used in a request/response fashion
  # by sending replies to requests from the client
  def handle_in("ping", payload, socket) do
    {:reply, {:ok, payload}, socket}
  end

  def handle_in("show", _, socket) do    
    ...
  end

  def handle_in("command", request, socket) do
    ...
  end

  def handle_in("remove", _, socket) do
    ...
  end

  def handle_in("ship_templates", _, socket) do
    ...
  end
end

После ответа, связанного с комментариями, я добавил код:

Process.flag(:trap_exit, true)
monitor_ref = Process.monitor(socket.channel_pid)
close(socket)

Теперь я получаю другое сообщение об ошибке: ** (exit) exited in: GenServer.call(PlexServer.EmpireSupervisor, {:terminate_child, :empire4}, :infinity) ** (EXIT) no process


person Alejandro Huerta    schedule 11.11.2016    source источник
comment
@Dogbert Я отредактировал свой вопрос. Это не решило мою проблему.   -  person Alejandro Huerta    schedule 11.11.2016
comment
Это похоже на несвязанную ошибку. У меня проходит следующий тест: gist.github.com/66f969eae3cf361740cb77a7e9773208. Можете ли вы попробовать воспроизвести ошибку в новом приложении Phoenix или опубликовать больше кода и полные сообщения об ошибках, чтобы я мог попытаться воспроизвести ее?   -  person Dogbert    schedule 11.11.2016
comment
@Dogbert, да, я считаю, что ты прав. В моем присоединении к каналу я запускаю процесс через супервизора, и это должно быть то, что идет не так. Я добавил больше кода, но я буду исследовать. На этот вопрос, похоже, был дан ответ с помощью дубликата.   -  person Alejandro Huerta    schedule 11.11.2016
comment
Я думаю, у вас должна быть опция здесь, на этой странице, чтобы мгновенно принять мой голос «Закрыть как дубликат».   -  person Dogbert    schedule 12.11.2016
comment
@Dogbert Хм, я нигде не вижу такой опции. Я добавил свой голос, чтобы закрыть его.   -  person Alejandro Huerta    schedule 15.11.2016