我的测试中有这段代码
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/