如何在IEx Shell中直接调用Elixir测试文件中的测试函数?
Elixir测试相关问题解答
1. 在iex shell中能否直接调用Test.exs中的函数?
默认不行,因为.exs测试文件不在应用默认编译路径中,且测试依赖的模块(如Mirror.DataCase这类测试支持模块)未加载。要实现调用,需先加载测试环境:
- 执行
iex -S mix test --no-start启动iex,此时测试环境的所有依赖模块会被自动加载 - 编译目标测试文件:
c("test/mirror/imports_test.exs") - 之后即可直接调用测试模块内的函数,例如:
Mirror.ImportsTest."test extract_csv, header_only/1"()
2. 测试环境自动回滚无法查看数据库结果,有什么简便方法?
无需逐行复制代码,可尝试以下方案:
- 临时提交事务:在测试函数需要查看数据的位置添加代码,手动提交事务:
提交后数据库会保留更新结果,注意测试结束后需手动清理数据。Ecto.Adapters.SQL.query!(Mirror.Repo, "COMMIT") - 在iex中执行测试逻辑:用
iex -S mix test --no-start启动iex,直接复制测试里的业务逻辑执行(无需包裹在test块内),或编译测试文件后直接调用测试函数。 - 按标签跳过回滚:在
Mirror.DataCase的setup回调中,根据测试标签决定是否启用事务。给目标测试添加@tag :no_rollback,然后修改DataCase:
运行测试时用setup tags do unless tags[:no_rollback] do Ecto.Adapters.SQL.begin_test_transaction(Mirror.Repo) on_exit(fn -> Ecto.Adapters.SQL.rollback_test_transaction(Mirror.Repo) end) end :ok endmix test --only external,即可跳过自动回滚。
3. 编译imports_test.exs时找不到Mirror.DataCase模块,如何解决?
Mirror.DataCase通常位于test/support/data_case.ex,该目录默认不在应用编译路径内,直接编译测试文件会找不到依赖模块。解决方法:
- 先编译测试支持模块:在iex中先编译DataCase文件,再编译测试文件:
c("test/support/data_case.ex") c("test/mirror/imports_test.exs") - 用测试环境启动iex:直接执行
iex -S mix test --no-start,Mix会自动加载测试目录下的所有支持模块,之后可正常编译并运行测试文件。 - (不推荐)修改
mix.exs的elixirc_paths,将test/support加入编译路径,但会导致测试模块被编译进生产环境,仅适合临时调试。
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

