如何在Phoenix中的每个测试案例中清理数据

时间:2018-07-04 18:40:29

标签: elixir phoenix-framework ecto

如果第二个测试用例在第一个测试用例之后运行,那么它将失败,因为数据库具有在第一个测试用例中创建的ReservationInfo条目。

defmodule MyProj.TestABC do
    use ExUnit.Case
    alias MyProj.Models.ReservationInfo
    alias MyProj.Repo

    test "Create Coordinates" do
        reservation_result = ReservationInfo.create(["00.00", "00.01"])          
        assert reservation_result == [{"00.00", :created}, {"00.01", :created}]
    end

    test "Shouldn't have above created coordinates as it's different test case" do
        assert [] == ReservationInfo.get_all()
    end
end

我想在运行新的测试用例之前截断所有数据,就像Django为每个测试用例清除数据一样。

3 个答案:

答案 0 :(得分:1)

在案例中,您可以使用setup定义要在每次测试之前运行的回调。

def clean_test_data(context) do
  # perform setup
  :ok
end

setup :clean_test_data

答案 1 :(得分:1)

在您的test.exs配置中,为您的仓库添加一个沙箱池:

config :your_app, YourApp.Repo,
  adapter: Ecto.Adapters.Postgres,
  database: "yourapp_test",
  username: "username",
  password: "password",
  hostname: "localhost",
  pool: Ecto.Adapters.SQL.Sandbox

在测试文件中有一个设置块:

setup do
  :ok = Ecto.Adapters.SQL.Sandbox.checkout(YourApp.Repo)
end

然后,在运行测试时,请使用MIX_ENV=test环境:

MIX_ENV=test mix test

答案 2 :(得分:0)

由于您使用的是Phoenix,因此在test/support/data_case.ex中有一个漂亮的助手为您管理。

假定该帮助程序用于需要访问数据层的测试中,因此它将在其自己的数据库事务中运行每个测试块,并在测试完成时回滚该事务。

只需将ExUnit.Case替换为TestABC.DataCase,您就应该做好了。注意:通常不希望使用:async模式,因为在测试运行时可能会产生副作用和死锁。

除了phoenix指南中的实现外,还有一些其他文档:https://hexdocs.pm/phoenix/testing_schemas.html#test-driving-a-changeset