【发布时间】:2018-05-27 02:26:47
【问题描述】:
在我的 Phoenix 应用程序中,我有一个被MyApp.Endpoint.broadcast(topic, type, data) 污染的频道。这个广播是由一些外部源事件触发的(在我的例子中是 RabbitMQ。)
场景是:MQ 客户端收到一条消息⇒ 应用程序将它广播给特定频道的所有订阅者。我在测试中使用本地本地 RabbitMQ 服务器。
我将如何测试它? Phoenix.ChannelTest.assert_broadcast/3 不能说“进程邮箱是空的。”。
assert_reply 需要一个引用并且被称为assert_reply Phoenix.Channel.socket_ref(socket), ... 不能正常工作,引发 “(ArgumentError) 套接字引用只能为与推送引用连接的套接字生成”。 em>
我很肯定广播确实在触发(在dev 和test 环境中使用wsta 进行检查。)
所以,我的问题是:如何在 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
【问题讨论】:
-
猜猜看:你试过增加
assert_broadcast的超时时间吗? -
@Dogbert 当然,现在是
5_000:) 那是我的第一次尝试。
标签: websocket elixir integration-testing phoenix-framework