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

标签 elixir phoenix-framework

我的测试中有这段代码

setup do
  client = Exredis.start

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

  {:ok, client: client}
end

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

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

最佳答案

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

一些忠告:

  • 如果您有许多需要连接的测试,我将在 test_helper.exs 中启动一个命名连接并在我的测试中使用它:
    Exredis.start(name: MyApp.Redis)
    

    不确定是否Exredis支持以上语法
  • 我建议您使用 redix它有一个更惯用的 Elixir API。例如,在 Elixir 的约定中,start应该总是返回 {:ok, pid} .但是,即使如此,图书馆也不应该提倡使用 start像 exredis 一样的功能,因为这意味着你可以留下悬空的 Redis 连接。你真的应该使用 start_link
  • 切记不要将依赖 Redis 的测试标记为 async: true ,因为它们之间会有竞争条件
  • 关于elixir - 为什么这个 Exredis 客户端不会在 on_exit 回调中抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33197108/

    相关文章:

    websocket - 我如何知道 Phoenix channel 的连接数量?

    elixir - 无法识别 2 个字段上的 unique_constraint

    elixir - 您如何为 ueberauth 身份进行单独的注册回调

    elixir - 从 Ecto 模型中的非公共(public)模式中选择表

    elixir - 如何在 Phoenix 的 channel 上启用压缩?

    elixir - 添加一个唯一字段并填充它

    elixir - 如何查看Phoenix(Elixir框架)安装的版本?

    javascript - 从字符串解析对象时,JSON 中出现意外的标记 &

    visual-c++ - c_src\bcrypt_nif.c(94): error C2275: 'ERL_NIF_TERM' : illegal use of this type as an expression

    elixir - 有没有办法将上传的文件返回给用户?