通常、mix.test
はテストデータベースを消去しますが、動作していません。
users
スキーマを作成して遊んでいたのに、作成したものを使いたくなかったので、それを削除した可能性があります。その後、最初からやり直して、最初のスキーマとは異なる新しいスキーマをユーザー向けに作成しました。
ミックステストを再度実行しようとすると、新しいスキーマで存在するはずだったフィールドが存在しないというエラーが発生しました。
MIX_ENV=test
の後にmix do ecto.drop
、mix ecto.reset
、またはmix ecto.rollback
などのコマンドを続けることで、テストデータベースにアクセスできます。
この特定のケースでは、MIX_ENV=test mix ecto.reset
を使用しました。
アプリケーションに複数のリポジトリ(DB)がある場合は、特定のリポジトリを指定して、すべてのリポジトリに操作を適用しないようにします。例えば
mix ecto.drop --repo Order.Repo
Ectoタスクの詳細を調べるには、mix help <task>
を使用します
このようにエイリアスを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"