gpt4 book ai didi

sockets - 配置 channel 测试超时 Phoenix

转载 作者:行者123 更新时间:2023-11-28 21:22:03 25 4
gpt4 key购买 nike

我有一个 channel ,在执行某种同步时,我用它向客户端推送消息:

defmodule AppWeb.SyncChannel do
use AppWeb, :channel

def join("sync:database", _payload, socket) do
send(self(), {:sync, :database})

{:ok, socket}
end

def handle_info({:sync, :database}, socket) do
Process.sleep(2000)
push(socket, "one", %{})
Process.sleep(2000)
push(socket, "two", %{})
Process.sleep(2000)
push(socket, "three", %{})

{:noreply, socket}
end
end

我有这个 channel 的测试:

defmodule AppWeb.SyncChannelTest do
use AppWeb.ChannelCase, async: false

alias AppWeb.SyncChannel

describe "sync:database" do
setup do
{:ok, _, socket} = subscribe_and_join(socket(), SyncChannel, "sync:database")

{:ok, socket: socket}
end

test "socket pushes 3 messages", %{socket: _socket} do
assert_push("one", %{})
assert_push("two", %{})
assert_push("three", %{})
end
end
end

但是当我运行测试时,出现错误:

Compiling 1 file (.ex)
...

1) test sync:database socket pushes 3 messages (AppWeb.SyncChannelTest)
test/app_web/channels/sync_channel_test.exs:13
** (exit) exited in: GenServer.call(#PID<0.478.0>, :socket, 5000)
** (EXIT) time out
stacktrace:
(elixir) lib/gen_server.ex:830: GenServer.call/3
(phoenix) lib/phoenix/test/channel_test.ex:360: Phoenix.ChannelTest.join/4
test/app_web/channels/sync_channel_test.exs:8: AppWeb.SyncChannelTest.__ex_unit_setup_1/1
test/app_web/channels/sync_channel_test.exs:1: AppWeb.SyncChannelTest.__ex_unit__/2

.

Finished in 5.2 seconds
5 tests, 1 failure

Randomized with seed 119011

如何在我的测试中配置 channel 超时,以便 handle_info 函数能够运行超过默认的 5 秒。

我曾尝试在 config/ 文件中尝试配置它,但并不高兴,也在 app_web/channels/user_socket.ex 中进行配置,但我还是做不到在任何地方找到指定的 timeout

最佳答案

Phoenix.ChannelTest.join calls Phoenix.Channel.Server.socket/1哪个makes a GenServer call to the channel with no configurable timeout从 GenServer 的状态获取底层套接字。我相信,由于您从 join 函数向自己发送消息,因此在测试代码能够获取套接字值之前,GenServer 会处理该消息,并且该调用的默认超时时间为 5 秒,您会收到此超时错误。

一个解决方法是使用Process.send_after/3稍微延迟发送self :

Process.send_after(self(), {:sync, :database}, 100)

您还需要增加 assert_push 调用的超时时间,因为超时默认为 100 毫秒,而您的消息最多会在大约 6 秒后到达。

assert_push ..., ..., 10000

同样,Process.send_after/3 只是一种解决方法。更有知识的人也许能够提供真正的解决方案。

关于sockets - 配置 channel 测试超时 Phoenix ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49331141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com