如何回滚,重置或删除Ecto测试数据库?

Kat*_*ine 29 testing elixir ecto phoenix-framework

通常mix.test清理测试数据库,但它不起作用.

这可能是因为我正在玩制作users架构,但不想使用我制作的东西,所以我摆脱了它.然后我重新开始为用户创建了一个与第一个不同的新模式.

当我再次尝试运行混合测试时,出现了一个错误,即某些字段不存在,应该存在新模式.

Kat*_*ine 46

您可以使用MIX_ENV=test后跟命令(例如mix do ecto.drop,mix ecto.reset或)来访问测试数据库mix ecto.rollback.

在我使用的这个特殊情况下mix help <task>.


如果您的应用程序有多个repos(DB),您将需要指定一个特定的repo以避免应用于所有repos的操作.例如

MIX_ENV=test mix ecto.reset
Run Code Online (Sandbox Code Playgroud)

要了解有关Ecto任务的更多信息,请使用 MIX_ENV=test


小智 5

您可以像这样将别名设置为mix.exs

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
Run Code Online (Sandbox Code Playgroud)

并且您需要将数据库运行到沙盒模式。

您的/appdir/test/test_helper.exs应该像这样

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

和/appdir/config/test.exs这样

config :project_name, ProjectName.DB.Repo,
  pool: Ecto.Adapters.SQL.Sandbox,
  database: "database_name_test"
Run Code Online (Sandbox Code Playgroud)