为什么这个 Exredis 客户端不会在 on_exit 回调中抛出错误?

Why does this Exredis client not throw an error in on_exit callback?

我的测试中有这段代码

setup do
  client = Exredis.start

  on_exit fn ->
    client |> Exredis.query ["FLUSHALL"]
  end

  {:ok, client: client}
end

当我运行混合测试时,我永远不会得到一个错误,说客户端进程在匿名函数的闭包上不存在。测试将继续 运行,我的测试将失败,因为它会清除我的 Redis。

另一方面,如果您尝试 运行 Exredis.query 一个不存在的进程,您将得到一个退出错误。

on_exit/1 在与测试进程不同的进程上回调 运行。从理论上讲,这就是查询应该起作用的原因,如果不起作用,则您需要调查 exredis.

一些建议:

  1. 如果您有很多测试需要连接,我会在 test_helper.exs 中启动一个命名连接并在我的测试中使用它:

    Exredis.start(name: MyApp.Redis)
    

    不确定Exredis是否支持上面的语法

  2. 我建议您使用 redix,它有一个更惯用的 Elixir API。例如,在 Elixir 的约定中,start 应该总是 return {:ok, pid}。但是,尽管如此,该库不应该像 exredis 那样推广 start 函数的使用,因为这意味着您可以留下悬空的 Redis 连接。你真的应该使用 start_link

  3. 记住不要将依赖 Redis 的测试标记为 async: true,因为它们之间会有竞争条件