Elixir:如何在mix.exs配置mod后运行测试?
问题分析
你碰到的这个情况很典型:当mix test运行时,它会自动启动你的应用,而mix.exs里的mod: {MyProject, []}配置会让Elixir调用MyProject.start/2方法,并且会把测试相关的参数(比如环境标识)传递进去——但你的start方法大概率只适配了mix run myproject ARGS时的自定义参数,所以才会冲突报错。
解决方案(无需修改mix.exs的两种方式)
1. 让MyProject.start/2兼容测试环境
修改你的启动模块代码,通过判断当前运行环境,让启动逻辑同时适配正常运行和测试场景:
defmodule MyProject do use Application def start(_type, args) do # 根据环境分支处理启动逻辑 case Mix.env() do :test -> # 测试环境下直接启动监督树,忽略传入的测试相关参数 MyProject.Supervisor.start_link([]) _ -> # 正常运行时,处理传入的自定义参数 MyProject.Supervisor.start_link(args) end end end
这样不管是执行mix run myproject ARGS还是mix test,启动逻辑都能正常工作,完全不用改动mix.exs。
2. 运行测试时禁用自动启动应用
用--no-start参数跳过测试时的自动应用启动,然后在测试辅助文件里手动启动应用:
首先执行测试命令:
mix test --no-start
接着修改test/test_helper.exs文件,添加手动启动应用的代码:
ExUnit.start() # 手动启动应用,不会触发mod配置的start方法 Application.ensure_all_started(:my_project)
这种方式完全不需要改动业务启动逻辑,通过命令行参数和测试辅助文件规避参数冲突问题。
补充建议
如果你的启动逻辑不算太复杂,第一种方式更优雅,因为它让启动模块本身具备环境兼容性;如果不想碰业务代码,第二种方式会更灵活。
内容的提问来源于stack exchange,提问作者tokosh
相关产品推荐
相关产品推荐

