Тестирование с Ecto
Исходный кодПосле успешной настройки подключения к базе данных с помощью Ecto для вашего приложения потребуется внести дополнительные изменения, чтобы использовать его в тестах, особенно если вы хотите воспользоваться песочницей Ecto SQL, которая позволяет одновременно запускать тесты, взаимодействующие с базой данных.
Создайте файл config/test.exs или добавьте в него следующее содержимое:
import Config config :my_app, MyApp.Repo, username: "postgres", password: "postgres", database: "myapp_test", hostname: "localhost", pool: Ecto.Adapters.SQL.Sandbox
Таким образом, мы настраиваем подключение к базе данных для тестового окружения. В данном случае мы используем базу данных Postgres и настраиваем пул песочницы, который оборачивает каждый тест в транзакцию.
Не забудьте импортировать конфигурацию тестового окружения в самом конце config/config.exs:
import_config "#{config_env()}.exs"
Также необходимо добавить в конце test/test_helper.exs явное указание режима sandbox:
Ecto.Adapters.SQL.Sandbox.mode(MyApp.Repo, :manual)
Наконец, необходимо установить подключение к базе данных перед запуском тестов. Это можно включить для всех тестовых случаев, расширив шаблон ExUnit, или настроить отдельно для каждого теста. Начнём с первого варианта и поместим его в test/support/repo_case.ex:
defmodule MyApp.RepoCase do
use ExUnit.CaseTemplate
using do
quote do
alias MyApp.Repo
import Ecto
import Ecto.Query
import MyApp.RepoCase
# and any other stuff
end
end
setup tags do
pid = Ecto.Adapters.SQL.Sandbox.start_owner!(MyApp.Repo, shared: not tags[:async])
on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
:ok
end
end
Приведённый выше шаблон тестового случая добавляет функции Ecto и Ecto.Query в ваши тесты и получает подключение к базе данных. Если тест выполняется не асинхронно, он также включает общий режим подключения к песочнице. Дополнительные сведения см. в разделе Ecto.Adapters.SQL.Sandbox.
Чтобы добавить папку test/support/ для компиляции в тестовом окружении, необходимо обновить конфигурацию mix.exs
def project do
[
# ...
elixirc_paths: elixirc_paths(Mix.env())
]
end
# Specifies which paths to compile per environment.
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
Затем в каждом тесте, использующем репозиторий:
defmodule MyApp.MyTest do use MyApp.RepoCase # Tests etc... end
Если вы не хотите определять «шаблон тестового случая», можно получить подключение для каждого отдельного тестового случая:
defmodule MyApp.MyTest do
use ExUnit.Case
setup do
:ok = Ecto.Adapters.SQL.Sandbox.checkout(MyApp.Repo)
end
# Tests etc...
end
Для удобства можно также определить aliases, чтобы автоматически настраивать базу данных при запуске тестов. Измените следующее содержимое в файле mix.exs.
def project do
[app: :my_app,
...
aliases: aliases()]
end
defp aliases do
[ ...
"test": ["ecto.create --quiet", "ecto.migrate", "test"]
]
end
© 2014 Chris McCord
Licensed under the MIT License.
https://ecto.hexdocs.pm/testing-with-ecto.html