У меня есть следующий канал 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
в тестовом примере после отправки сообщения?
assert :sys.get_state(socket.channel_pid)[:current_number] == 356
? - person Dogbert   schedule 19.06.2017