我的测试中有这段代码

setup do
  client = Exredis.start

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

  {:ok, client: client}
end


当我运行混合测试时,我永远不会收到错误消息,说明匿名进程的关闭中不存在客户端进程。该测试将继续运行,并且我的测试会以为它可以清除我的Redis而失败。

另一方面,如果您尝试在不存在的进程上运行Exredis.query,则会收到Exit错误。

最佳答案

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

一些忠告:


如果您有许多需要连接的测试,则可以在test_helper.exs中启动一个命名连接,并在测试中使用它:

Exredis.start(name: MyApp.Redis)


不确定Exredis是否支持上述语法
我建议您使用redix,它具有更惯用的Elixir API。例如,按照Elixir的约定,start应该始终返回{:ok, pid}。但是,尽管如此,该库也不应像exredis那样促进start函数的使用,因为这意味着您可以留下悬挂的Redis连接。您应该真正使用start_link
请记住不要将依赖Redis的测试标记为async: true,因为它们之间会存在竞争条件

关于elixir - 为什么此Exredis客户端不会在on_exit回调中引发错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33197108/

10-13 06:13