在我的凤凰应用程序中,我有一个被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连接的套接字生成”
我很肯定广播确实在触发(使用wsta
在dev
和test
环境中进行了检查。)
所以,我的问题是:如何测试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
答案 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