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

时间:2015-10-18 10:55:01

标签: elixir phoenix-framework

我的测试中有这段代码

setup do
  client = Exredis.start

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

  {:ok, client: client}
end

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

另一方面,如果您尝试在未使用的进程上运行Exredis.query,则会出现Exit错误。

1 个答案:

答案 0 :(得分:3)

on_exit/1回调在与测试过程不同的进程上运行。理论上这就是为什么查询应该有效,如果没有,那么你需要调查exredis

一些建议:

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

    Exredis.start(name: MyApp.Redis)
    

    不确定Exredis是否支持上述语法

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

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