Как откат, reset или падение базы данных тестирования Ecto?

Обычно mix.test очищает тестовую базу данных, но она не работает.

Возможно, потому, что я играл с созданием схемы users, но не хотел использовать то, что сделал, поэтому я избавился от него. Затем я начал работу и создал новую схему для пользователей, которая отличалась от первой.

Когда я снова попытался запустить тест микширования, произошла ошибка в том, что некоторые поля не существовали, что должно было быть там с новой схемой.

Ответ 1

Вы можете получить доступ к тестовой базе данных, используя MIX_ENV=test, а затем такую команду, как mix do ecto.drop, mix ecto.reset или mix ecto.rollback.

В данном конкретном случае я использовал:

MIX_ENV=test mix ecto.reset

Если ваше приложение имеет несколько репо (БД), вам нужно указать конкретное репо, чтобы избежать применения операции ко всем репо. Например,

mix ecto.drop --repo Order.Repo

Чтобы узнать больше о задаче Ecto, используйте mix help <task>

Ответ 2

Вы можете установить псевдонимы в mix.exe, как это

defp aliases do
  [
   "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
   "ecto.reset": ["ecto.drop", "ecto.setup"],
   "test":       ["ecto.create --quiet", "ecto.migrate", "test"]
  ]
end

И вам нужно запустить базу данных в режиме песочницы.

Ваш/appdir/test/test_helper.exs должен выглядеть следующим образом:

Ecto.Adapters.SQL.Sandbox.mode(ProjectName.DB.Repo, {:shared, self()})
ExUnit.start(exclude: [:pending])

И/appdir/config/test.exs вроде этого

config :project_name, ProjectName.DB.Repo,
  pool: Ecto.Adapters.SQL.Sandbox,
  database: "database_name_test"