【发布时间】:2021-03-08 07:14:19
【问题描述】:
我在我的 Phoenix 应用程序中有一个测试,它正在测试使用 Genserver 的 Phoenix.PubSub 订阅者。订阅者将一些数据库工作作为其handle_info/2 的一部分。
test "sending creating a referral code upon user registration" do
start_supervised(MyApp.Accounts.Subscriber)
user = insert(:user)
Phoenix.PubSub.broadcast(MappApp.PubSub, "accounts", {:register, user})
assert_eventually(Repo.exists?(ReferralCode))
stop_supervised(MyApp.Accounts.Subscriber)
end
单独运行这个测试模块就可以了。但是,当我运行我的整个测试套件时,我会收到这样的错误(测试仍然通过):
[error] GenServer MyApp.Accounts.Subscriber terminating
** (stop) exited in: DBConnection.Holder.checkout(#PID<0.970.0>, [log: #Function<9.124843621/1 in Ecto.Adapters.SQL.with_log/3>, cache_statement: "ecto_insert_referral_codes", timeout: 15000, pool_size: 10, pool: DBConnection.Ownership])
** (EXIT) shutdown: "owner #PID<0.969.0> exited"
<stacktrace...>
这看起来是一个问题,当进程终止时数据库连接仍处于打开状态,因此它不会优雅地终止。但我不确定如何处理。
关于如何防止此错误的任何建议?
【问题讨论】:
-
你有没有机会用
async: true运行这个测试模块?如果是这样,那可能是罪魁祸首。 -
我是
useingModelCase模块。这是默认行为吗? -
如果您只有
use ModelCase(而不是use ModelCase, async: true),那么模块中的测试将不会与其他模块中的测试同时运行,这可能是您想要的。 (虽然我不知道你的 ModelCase 长什么样) -
基本上是库存(现在在凤凰城称为
DataCase:github.com/phoenixframework/phoenix/blob/master/installer/…)。 -
我尝试了使用和不使用
async: false,并且发生了同样的错误。我认为ModelCase运行测试非异步
标签: elixir gen-server ex-unit