Тестирование Ecto 2.0 в зонтичном приложении

Я пытаюсь настроить приложение под эгидой, которое будет обрабатывать бизнес-логику. Он использует 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)

person Maciej Szlosarczyk    schedule 18.09.2016    source источник
comment
Я считаю, что вам нужно добавить следующее в блок setup тестовых модулей (это делает Phoenix): :ok = Ecto.Adapters.SQL.Sandbox.checkout(Domain.Repo). Не могли бы вы попробовать это?   -  person Dogbert    schedule 18.09.2016
comment
Я только что добавил в тесты следующее, все то же поведение: setup do :ok = Ecto.Adapters.SQL.Sandbox.checkout(Domain.Repo) end   -  person Maciej Szlosarczyk    schedule 18.09.2016
comment
А, я неправильно прочитал ошибку. Вам нужно начать Domain.Repo перед тестами. Если у этого пакета есть Application, попробуйте добавить supervisor(Domain.Repo, []) в его список дочерних элементов, в противном случае попробуйте добавить Domain.Repo.start_link() после ExUnit.start().   -  person Dogbert    schedule 18.09.2016
comment
Это помогло, спасибо!   -  person Maciej Szlosarczyk    schedule 18.09.2016


Ответы (1)


(EXIT) no process в GenServer.call означает, что сервер, на который вы пытались отправить запрос на вызов, в настоящее время не работает. Вы должны убедиться, что Domain.Repo работает, прежде чем вызывать Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual).

Самый распространенный способ — добавить Domain.Repo в качестве Supervisor в дерево наблюдения Application. Для этого добавьте в список children в Domain.start/2 следующее:

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

Если по какой-то причине вы хотите запустить репозиторий только в своих тестах, вы также можете добавить следующее перед вызовом Ecto.Adapters.SQL.Sandbox.mode(Domain.Repo, :manual) в test/test_helper.exs:

Domain.Repo.start_link()
person Dogbert    schedule 18.09.2016
comment
Для меня важным был последний абзац, мне нужно было только запустить репо во время тестирования. - person Andre Albuquerque; 10.07.2017