【发布时间】:2016-11-18 16:29:56
【问题描述】:
早上好,
我的 Elixir 项目中有一些特别昂贵的数据库设置代码,用于将所需的数据插入数据库。
我目前正在运行我的测试,以便在任何需要它的测试之前通过 @tag :insert_my_data 构造插入此数据。我的测试助手中有代码,它执行以下操作:
setup tags do
if tags[:insert_my_data] do
# Run code here
end
end
问题在于我必须运行此代码数百次,而且速度很慢。
如果代码在任何 mix test 调用之前自动运行一次,并且 Ecto 提供的事务回滚功能将重置为这个已知状态(而不是空数据库),那么效果会更好。
我怎样才能做到这一点?
谢谢!
【问题讨论】:
-
也许
setup_all会有所帮助? elixir-lang.org/docs/v1.3/ex_unit/… -
@Dogbert 可以在
setup_all中使用应用程序代码和数据库插入吗?还是setup_all的其他限制?我现在记不清了,但我觉得我看过这个。 -
@Dogbert 似乎
setup_all在每个测试用例开始时运行。我想在测试“套件”开始时运行一次代码 - 而且只运行一次。 -
你的用例是什么?
-
您可以为您的
mix任务创建一个别名 - 并且可以在那里完成此 db-refresh。它适用于单个测试或任何一组测试作为一个整体。例如,我的mix.exs文件有:``` defp aliases do [ "ecto.seed": "run priv/repo/seeds.exs", "ecto.setup": ["ecto.create", "ecto .migrate", "ecto.seed"], "ecto.reset": ["ecto.drop", "ecto.setup"], 测试: ["ecto.drop", "ecto.create --quiet", " ecto.migrate", "test"], commit: ["format", "deps.get --only #{Mix.env()}", "coveralls.html", "credo --strict"] ] end ` ``