You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
    end
    
    运行测试时用mix 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:05:25