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

Ale*_*kin 5 integration-testing elixir websocket phoenix-framework

在我的 Phoenix 应用程序中,我有一个被MyApp.Endpoint.broadcast(topic, type, data). 该广播是由一些外部源事件触发的(在我的例子中是\xe2\x80\x99s RabbitMQ。)

\n\n

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

\n\n

我将如何测试它?Phoenix.ChannelTest.assert_broadcast/3不起作用说\xe2\x80\x9cThe processmailbox isempty.\xe2\x80\x9d

\n\n

assert_reply需要引用并且被调用为assert_reply Phoenix.Channel.socket_ref(socket), ...也不起作用,引发\xe2\x80\x9c(ArgumentError) 只能为已与推送引用\xe2\x80\x9d 连接的套接字生成套接字引用。

\n\n

我确信广播确实正在触发(在devtest环境中检查wsta。)

\n\n

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

\n\n
\n\n

当我尝试从测试进程订阅相应的频道时,按照@Kociamber的建议,它以同样的方式失败,\xe2\x80\x9cThe processmailbox isempty.\xe2\x80\x9d

\n\n
test "handle RabbitMQ message", %{socket: _socket} do\n  Phoenix.PubSub.subscribe MyApp.PubSub, "channel:topic"\n  payload = %{foo: "bar"}\n  RabbitMQ.trigger!(payload)\n  assert_receive ^payload, 3_000\nend\n
Run Code Online (Sandbox Code Playgroud)\n

Koc*_*ber 3

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

assert_receive ^expected_payload
Run Code Online (Sandbox Code Playgroud)

测试完成后,您可能还想取消订阅该主题Phoenix.PubSub.unsubscribe/2