2

我正在尝试在伞下设置一个应用程序来处理业务逻辑。它使用 Ecto 与数据库进行交互。我在设置 SQL.Sandbox 进行测试时遇到问题。每当我运行测试时,我都会收到此错误:

$ MIX_ENV=test mix test
** (exit) exited in: GenServer.call(Domain.Repo.Pool, :checkin, 5000)
  ** (EXIT) no process
  (elixir) lib/gen_server.ex:596: GenServer.call/3
  lib/ecto/adapters/sql/sandbox.ex:422: Ecto.Adapters.SQL.Sandbox.mode/2
  (elixir) lib/code.ex:363: Code.require_file/2
  (elixir) lib/enum.ex:651: Enum."-each/2-lists^foreach/1-0-"/2
  (elixir) lib/enum.ex:651: Enum.each/2

我的 config.exs 看起来像这样:

use Mix.Config

config :domain,
  ecto_repos: [Domain.Repo]

config :domain, Domain.Repo,
  adapter: Ecto.Adapters.Postgres,
  pool: Ecto.Adapters.SQL.Sandbox,
  username: "postgres",
  password: "postgres",
  database: "app_test"

我的 test_helper.exs 是:

ExUnit.start()
Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual)
4

1 回答 1

4

(EXIT) no processinGenServer.call表示您尝试向其发送呼叫请求的服务器当前不存在。您必须确保Domain.Repo在调用之前正在运行Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual)

最常见的方法是将Domain.Repoa添加SupervisorApplication的监督树中。为此,请将以下内容添加到中的children列表中Domain.start/2

children = [
  ...,
  supervisor(Domain.Repo, []) # add this
]

如果由于某种原因,您只想在测试中启动 Repo,您​​还可以在调用之前添加以下Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual)内容test/test_helper.exs

Domain.Repo.start_link()
于 2016-09-18T09:26:36.023 回答