为什么这个 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
.
一些建议:
如果您有很多测试需要连接,我会在 test_helper.exs 中启动一个命名连接并在我的测试中使用它:
Exredis.start(name: MyApp.Redis)
不确定Exredis
是否支持上面的语法
我建议您使用 redix,它有一个更惯用的 Elixir API。例如,在 Elixir 的约定中,start
应该总是 return {:ok, pid}
。但是,尽管如此,该库不应该像 exredis 那样推广 start
函数的使用,因为这意味着您可以留下悬空的 Redis 连接。你真的应该使用 start_link
记住不要将依赖 Redis 的测试标记为 async: true
,因为它们之间会有竞争条件
我的测试中有这段代码
setup do
client = Exredis.start
on_exit fn ->
client |> Exredis.query ["FLUSHALL"]
end
{:ok, client: client}
end
当我运行混合测试时,我永远不会得到一个错误,说客户端进程在匿名函数的闭包上不存在。测试将继续 运行,我的测试将失败,因为它会清除我的 Redis。
另一方面,如果您尝试 运行 Exredis.query 一个不存在的进程,您将得到一个退出错误。
on_exit/1
在与测试进程不同的进程上回调 运行。从理论上讲,这就是查询应该起作用的原因,如果不起作用,则您需要调查 exredis
.
一些建议:
如果您有很多测试需要连接,我会在 test_helper.exs 中启动一个命名连接并在我的测试中使用它:
Exredis.start(name: MyApp.Redis)
不确定
Exredis
是否支持上面的语法我建议您使用 redix,它有一个更惯用的 Elixir API。例如,在 Elixir 的约定中,
start
应该总是 return{:ok, pid}
。但是,尽管如此,该库不应该像 exredis 那样推广start
函数的使用,因为这意味着您可以留下悬空的 Redis 连接。你真的应该使用start_link
记住不要将依赖 Redis 的测试标记为
async: true
,因为它们之间会有竞争条件