1

我有以下凤凰频道处理传入的消息,广播它,然后更新频道实例的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在测试用例中获取新更新状态的方法。

  • 模块中没有assert_socket_state函数,Phoenix.ChannelTest我找不到任何允许获取最新套接字状态的函数

  • 我考虑过定义 ahandle_call或 ahandle_info来返回套接字状态,但这意味着我必须获取通道的 pid 才能调用它们。

  • 我考虑过handle_in为此目的定义一个,但我不想在我的频道中放入一个将在生产中可用的自省工具。

推送消息后,如何 socket 在测试用例中获取更新?

4

1 回答 1

2

socket状态包含一个channel_pid基本上包含pid通道的条目。

前一个与接受GenServer 并返回其最新的:sys.get_state/1函数相结合是关键!pidstate

示例,给定socket测试用例中的状态:

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

感谢 Dogbert这个问题的评论。

于 2017-06-20T00:11:26.747 回答