【问题标题】:In testing with Elixir, can the dB connection assigned to a GenServer be reassigned to the testing one?在使用 Elixir 进行测试时,分配给 GenServer 的 dB 连接是否可以重新分配给测试连接?
【发布时间】:2017-05-25 04:22:13
【问题描述】:

我的系统有一个应用程序,它启动了几个 GenServer,它们在初始化时会进行一些 dB 调用,从而获得它们自己的连接。

问题在于,在我对已将一些记录插入 dB 的控制器进行测试时,控制器会调用其中一个 GenServer,然后它会执行更多的 dB 查询。但由于是不同的沙盒,所以看不到记录。

我正在寻找一种一般的解决方案,它允许现有的、正在运行的 GenServer 使用与测试相同的沙箱。我将不胜感激任何想法。我尝试在测试设置中的沙盒结帐后立即添加以下内容,但没有帮助:

Ecto.Adapters.SQL.Sandbox.allow(MyApp.Repo, self(), Some.GenServer)

【问题讨论】:

  • 您无法异步运行这些测试。
  • 测试没有异步运行。
  • 其实,现在我也不确定。没有async: true,但它是否默认为Phoenix.ConnTest?很难找到这方面的信息。
  • 那么看不到你的代码,就很难调试了。因为如果测试是同步运行的,它应该可以工作。你的setup 看起来像this 吗?
  • 减去第 4 行和第 6 行,是的,完全一样。

标签: testing elixir sandbox ecto


【解决方案1】:

我发现的唯一可行的解​​决方案是允许 GenServer 以备用名称启动,从而使用与测试相同的沙箱数据库连接来启动它,让我的控制器使用这个不同命名的版本,然后将其关闭考试结束前。

【讨论】:

    【解决方案2】:

    似乎我最终遇到了同样的问题。 我的解决方案是保留默认的 Phoenix 设置,并在每次测试之前终止并重新启动我的进程,如下所示:

    setup(%{conn: conn}) do
        Supervisor.terminate_child(Some.Supervisor, Some.GenServer)
        Supervisor.restart_child(Some.Supervisor, Some.GenServer)
        {:ok, conn: conn}
    end
    

    测试不应该是异步的:true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2016-09-13
      • 2015-09-17
      • 1970-01-01
      • 2021-05-15
      • 2018-10-25
      • 2022-11-22
      相关资源
      最近更新 更多