web-dev-qa-db-ja.com

Ectoテストデータベースをロールバック、リセット、またはドロップする方法

通常、mix.testはテストデータベースを消去しますが、動作していません。

usersスキーマを作成して遊んでいたのに、作成したものを使いたくなかったので、それを削除した可能性があります。その後、最初からやり直して、最初のスキーマとは異なる新しいスキーマをユーザー向けに作成しました。

ミックステストを再度実行しようとすると、新しいスキーマで存在するはずだったフィールドが存在しないというエラーが発生しました。

24
Katherine

MIX_ENV=testの後にmix do ecto.dropmix ecto.reset、またはmix ecto.rollbackなどのコマンドを続けることで、テストデータベースにアクセスできます。

この特定のケースでは、MIX_ENV=test mix ecto.resetを使用しました。


アプリケーションに複数のリポジトリ(DB)がある場合は、特定のリポジトリを指定して、すべてのリポジトリに操作を適用しないようにします。例えば

mix ecto.drop --repo Order.Repo

Ectoタスクの詳細を調べるには、mix help <task>を使用します

41
Katherine

このようにエイリアスを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

また、データベースをサンドボックスモードで実行する必要があります。

/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"
4
Oleg Samorai