测试客户端通道是否收到消息

时间:2017-12-13 08:53:35

标签: websocket elixir integration-testing phoenix-framework

在我的凤凰应用程序中,我有一个被MyApp.Endpoint.broadcast(topic, type, data)污染的频道。这个广播是由一些外部源事件触发的(在我的例子中是RabbitMQ。)

场景是:MQ客户端收到消息⇒应用程序将其广播给特定频道的所有订阅者。我在测试中使用本机本地RabbitMQ服务器。

我该如何测试? Phoenix.ChannelTest.assert_broadcast/3无效“进程邮箱为空。”

assert_reply需要引用并且被调用为assert_reply Phoenix.Channel.socket_ref(socket), ...不起作用,引发“(ArgumentError)套接字引用只能为已经与push ref连接的套接字生成”

我很肯定广播确实在触发(使用wstadevtest环境中进行了检查。)

所以,我的问题是:如何测试Phoenix测试套件中某些外部源触发的广播事件?

当我尝试按照@Kociamber的建议从测试过程订阅相应的频道时,它以“进程邮箱为空”的方式失败。

test "handle RabbitMQ message", %{socket: _socket} do
  Phoenix.PubSub.subscribe MyApp.PubSub, "channel:topic"
  payload = %{foo: "bar"}
  RabbitMQ.trigger!(payload)
  assert_receive ^payload, 3_000
end

2 个答案:

答案 0 :(得分:1)

我发现以下对频道(和广播)测试非常有用,看起来它也适用于你。首先,您需要使用Phoenix.PubSub.subscribe/2订阅您的主题,定义您的预期消息(有效负载)值,然后使用assert_receive/2对其进行测试:

assert_receive ^expected_payload

您可能还希望在使用Phoenix.PubSub.unsubscribe/2

完成测试后取消订阅该主题

答案 1 :(得分:-1)

这是向渠道成员广播消息的测试,这可能会对您有所帮助

 test "new_msg event broadcasts new message to other channel members",
  %{socket1: socket1, user1: user1, group: group} do
     {:ok, _, socket1} = subscribe_and_join(socket1, "groups:#
    {group.slug}")

   @endpoint.subscribe("groups:#{group.slug}")

   ref = push socket1, "new_msg", %{text_content: "Hello, World!"}
   assert_reply ref, :ok

   assert_broadcast "new_msg", data

   assert data.user_id == user1.id
   assert data.text_content == "Hello, World!"
 end