如何在Channel测试用例中阅读新的Phoenix通道实例的状态?

时间:2017-06-19 17:56:42

标签: elixir integration-testing phoenix-framework phoenix-channels ex-unit

我有以下凤凰频道处理传入的消息,广播它然后更新频道实例的'^regex.*$'状态:

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.ChannelTesthandle_call,但这意味着我必须获取频道的pid才能调用它们。

  • 我考虑过为此目的定义一个handle_info,但我不想在我的频道中加入一个可以在制作中使用的内省工具。

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

1 个答案:

答案 0 :(得分:1)

socket状态包含channel_pid条目,该条目基本上包含频道的pid

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

示例,在测试用例中给出socket状态:

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

感谢 Dogbert对此问题的评论。