【问题标题】:Test failure due to Ecto and async task由于 Ecto 和异步任务导致测试失败
【发布时间】:2017-03-29 22:43:02
【问题描述】:

我遇到了有趣的问题。我有一个使用 arc-ecto 处理文件上传的测试。在上传模块中,我覆盖了storage_dir 函数。在那里我做了一个数据库调用来获取我正在上传的东西的父记录的 id。在实践中效果很好。

但测试很糟糕。我猜这与文件保存是一项异步任务这一事实有关。所以测试在文件保存之前完成。数据库连接已关闭,上传程序出错。这是错误:

15:33:10.457 [error] Postgrex.Protocol (#PID<0.325.0>) disconnected: ** (DBConnection.ConnectionError) owner #PID<0.535.0> exited while client #PID<0.538.0> is still running with: shutdown

15:33:10.645 [error] Postgrex.Protocol (#PID<0.331.0>) disconnected: ** (DBConnection.ConnectionError) owner #PID<0.596.0> exited while client #PID<0.599.0> is still running with: shutdown

15:33:10.674 [error] Task #PID<0.599.0> started from #PID<0.598.0> terminating
** (DBConnection.ConnectionError) tcp recv: closed
    (ecto) lib/ecto/adapters/postgres/connection.ex:115: Ecto.Adapters.Postgres.Connection.execute/4
    (ecto) lib/ecto/adapters/sql.ex:243: Ecto.Adapters.SQL.sql_call/6
    (ecto) lib/ecto/adapters/sql.ex:441: Ecto.Adapters.SQL.execute_or_reset/7
    (ecto) lib/ecto/repo/queryable.ex:130: Ecto.Repo.Queryable.execute/5
    (ecto) lib/ecto/repo/queryable.ex:35: Ecto.Repo.Queryable.all/4
    (ecto) lib/ecto/repo/queryable.ex:68: Ecto.Repo.Queryable.one/4
    (pedal_app) lib/pedal_app/web/uploaders/photo_uploader.ex:31: PedalApp.Web.PhotoUploader.storage_dir/2
    lib/arc/storage/local.ex:33: Arc.Storage.Local.build_local_path/3
    lib/arc/storage/local.ex:27: Arc.Storage.Local.delete/3
    (elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2
    (elixir) lib/task/supervised.ex:36: Task.Supervised.reply/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Function: #Function<0.51838860/0 in Arc.Actions.Delete.async_delete_version/3>
    Args: []

这很常见吗?我怎么能告诉我的测试在一切都完成之前不要放弃?

编辑:我的解决方法是对所有内容进行预加载,这样我就不会在上传程序中进行 db 调用。但问题仍然存在。

【问题讨论】:

    标签: elixir phoenix-framework ecto arc-ecto


    【解决方案1】:

    您可以禁用将@async false 添加到您的上传定义的异步处理。

    我确定您不想在开发/生产中禁用它,只在测试时禁用它。

    我会试试这个:

    您可以在config/test.exs 上添加:

    config :project_name, arc_async: false
    

    在您的上传者定义中,您可以添加:

    @async Application.get_env(:project_name, :arc_async, true)
    

    我没有测试它,所以不确定它是否会起作用,但至少可以尝试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多