在 umbrella 应用程序中测试 Ecto 2.0
Testing Ecto 2.0 in an umbrella app
我正在尝试在保护伞下设置一个应用程序来处理业务逻辑。它使用 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)
(EXIT) no process
in GenServer.call
表示您尝试向其发送调用请求的服务器当前不存在。在调用 Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual)
.
之前,您必须确保 Domain.Repo
是 运行
最常见的方法是将Domain.Repo
作为Supervisor
添加到Application
的监督树中。为此,请将以下内容添加到 Domain.start/2
中的 children
列表中:
children = [
...,
supervisor(Domain.Repo, []) # add this
]
如果出于某种原因,您只想在测试中启动 Repo,您还可以在 test/test_helper.exs
中调用 Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual)
之前添加以下内容:
Domain.Repo.start_link()
我正在尝试在保护伞下设置一个应用程序来处理业务逻辑。它使用 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)
(EXIT) no process
in GenServer.call
表示您尝试向其发送调用请求的服务器当前不存在。在调用 Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual)
.
Domain.Repo
是 运行
最常见的方法是将Domain.Repo
作为Supervisor
添加到Application
的监督树中。为此,请将以下内容添加到 Domain.start/2
中的 children
列表中:
children = [
...,
supervisor(Domain.Repo, []) # add this
]
如果出于某种原因,您只想在测试中启动 Repo,您还可以在 test/test_helper.exs
中调用 Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual)
之前添加以下内容:
Domain.Repo.start_link()