Как прочитать состояние нового экземпляра канала Phoenix в тестовом примере канала?

У меня есть следующий канал phoenix, который обрабатывает входящее сообщение, транслирует его, а затем обновляет состояние socket экземпляра канала:

defmodule MyApp.MyChannel do
  use MyApp.Web, :channel

  def join("topic", _payload, socket) do
    {:ok, socket}
  end

  def handle_in("update", %{"new_number" => number_}, socket) do
    broadcast socket, "update", %{"new_number" => number_} 
    {:noreply, assign(socket, :current_number, number_)}
  end
  ...
end

Я пытаюсь проверить поведение функции handle_in("update", ...) с помощью этого тестового примера:

test "should broadcast new number and update the relevant instance's socket state", %{socket: socket} do
  push socket, "update", %{"new_number" => 356}
  assert_broadcast "update", %{"new_number" => 356}
  ## This is testing against the old state
  ## which is going to obviously fail
  assert socket.assigns[:current_number] == 356  
end

Проблема здесь в том, что я не могу найти способ получить новое обновленное состояние socket внутри тестового примера.

  • В модуле Phoenix.ChannelTest нет функции assert_socket_state, и я не могу найти ни одной функции, позволяющей получить новейшее состояние сокета.

  • Я думал об определении handle_call или handle_info, которые возвращают состояние сокета, но это означает, что мне нужно будет получить pid канала, чтобы вызвать их.

  • Я думал об определении handle_in для этой цели, но я не хочу размещать на своем канале инструмент самоанализа, который будет доступен в продакшене.

Как я могу получить обновленное socket в тестовом примере после отправки сообщения?


person Chedy2149    schedule 19.06.2017    source источник
comment
Это работает: assert :sys.get_state(socket.channel_pid)[:current_number] == 356?   -  person Dogbert    schedule 19.06.2017


Ответы (1)


Состояние socket содержит запись channel_pid, которая в основном содержит pid канала.

Предыдущее в сочетании с функцией :sys.get_state/1, которая принимает pid GenServer и возвращает самый последний ключ state!

Пример, учитывая состояние socket внутри тестового примера:

:sys.get_state(socket.channel_pid).assigns[:current_number]

Благодарность Догберту за комментарий к вопросу.

person Chedy2149    schedule 20.06.2017