Ale*_*kin 5 integration-testing elixir websocket phoenix-framework
在我的 Phoenix 应用程序中,我有一个被MyApp.Endpoint.broadcast(topic, type, data). 该广播是由一些外部源事件触发的(在我的例子中是\xe2\x80\x99s RabbitMQ。)
场景是:MQ 客户端收到一条消息 \xe2\x87\x92,应用程序将其广播给特定通道的所有订阅者。我在测试中使用本机本地 RabbitMQ 服务器。
\n\n我将如何测试它?Phoenix.ChannelTest.assert_broadcast/3不起作用说\xe2\x80\x9cThe processmailbox isempty.\xe2\x80\x9d。
assert_reply需要引用并且被调用为assert_reply Phoenix.Channel.socket_ref(socket), ...也不起作用,引发\xe2\x80\x9c(ArgumentError) 只能为已与推送引用\xe2\x80\x9d 连接的套接字生成套接字引用。
我确信广播确实正在触发(在dev和test环境中检查wsta。)
所以,我的问题是:如何测试 Phoenix 测试套件中某些外部源触发的广播事件?
\n\n当我尝试从测试进程订阅相应的频道时,按照@Kociamber的建议,它以同样的方式失败,\xe2\x80\x9cThe processmailbox isempty.\xe2\x80\x9d,
\n\ntest "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\nRun Code Online (Sandbox Code Playgroud)\n
我发现以下方法对于频道(和广播)测试很有用,看起来它也应该适合您。首先,您需要使用 订阅您的主题Phoenix.PubSub.subscribe/2,定义您的预期消息(有效负载)值,然后使用assert_receive/2它进行测试:
assert_receive ^expected_payload
Run Code Online (Sandbox Code Playgroud)
测试完成后,您可能还想取消订阅该主题Phoenix.PubSub.unsubscribe/2
| 归档时间: |
|
| 查看次数: |
1464 次 |
| 最近记录: |