【发布时间】:2016-12-16 17:22:00
【问题描述】:
我在 Elixir Phoenix 项目中使用 Ecto 2.0 和 MySQL。
根据 Ecto2.0 documentation,MySQL 不支持并发测试,所以我想我应该使用 ExUnit.Case 而不是使用 ExUnit.Case, async: true,这样测试就不会同时运行。
在我的特定情况下,在我的测试中,我通过夹具将模型插入数据库中,一旦测试完成,夹具插入的模型仍保留在数据库中(由测试代码插入的模型本身会被清理)。我想删除夹具插入的模型。如果我这样做:
如果我这样做:
ExUnit.Case
setup do
on_exit fn ->
Repo.delete_all(ModelA)
Repo.delete_all(ModelB)
end
end
我明白了:
** (exit) exited in: GenServer.call(#PID<0.277.0>, {:checkout, #Reference<0.0.1.1885>, true, 15000}, 5000)
** (EXIT) shutdown: "owner #PID<0.276.0> exited with: shutdown"
stacktrace:
(db_connection) lib/db_connection/ownership/proxy.ex:32: DBConnection.Ownership.Proxy.checkout/2
那么,如果我这样做:
ExUnit.Case, async: true
setup do
on_exit fn ->
Repo.delete_all(ModelA)
Repo.delete_all(ModelB)
end
end
它可以工作并且夹具数据在数据库中被清理。但是如果我指定ExUnit.Case, async: true,在运行所有测试时,我会遇到问题,因为测试同时在 MySQl 上运行。
【问题讨论】:
-
你是从哪里插入灯具的?
-
fixtures 在 test/support 的一个模块中定义,它们被插入到 test 数据库中。测试正在使用和使用这些插入的固定装置,但它们不会自动清理。
标签: mysql elixir phoenix-framework ecto