Elixir测试环境下已存在的CartMaster模块报UndefinedFunctionError问题
解决方案
- 优先排查测试环境模块覆盖问题
检查test目录(包括test/support等辅助目录)下是否存在同名的Mock/空Commerce.Cart.CartMaster模块定义,很多时候为了测试写的Mock模块会覆盖正式代码的模块。可以在报错的call函数内插入代码验证模块源文件路径:
如果输出的路径不是你预期的正式代码lib目录下的路径,即可定位是模块被覆盖。IO.inspect(Commerce.Cart.CartMaster.module_info(:compile)[:source], label: :module_source) - 清理重建编译缓存
旧的损坏缓存可能导致该类异常,执行以下命令完全清理后重新编译测试环境代码:
编译完成后再运行测试验证问题是否解决。mix clean --deps MIX_ENV=test mix compile --force - 检查路径大小写匹配
macOS文件系统默认大小写不敏感,而Linux/CI环境通常大小写敏感,如果你的模块文件路径存在大小写不匹配(比如lib/commerce/Cart/cart_master.ex 或者文件名写成CartMaster.ex),本地开发环境可以正常加载,但测试运行在Linux环境时就会找不到模块。确认路径完全匹配:lib/commerce/cart/cart_master.ex,所有路径层级和模块命名大小写完全对应。 - 检查伞项目依赖配置
如果你使用的是umbrella项目,确认运行测试的应用的mix.exs中,已经把Commerce.Cart所属的应用加入了测试环境的依赖列表,不要仅在dev环境声明依赖。 - 排查测试Mock库的异常操作
如果你在测试中使用了Mox、Meck等Mock库,检查是否存在错误的模块替换/卸载配置,比如在test_helper.exs或者测试用例的setup块中,错误地将Commerce.Cart.CartMaster模块替换为未实现对应函数的Mock对象,或是在测试结束后没有正常恢复模块。
内容的提问来源于stack exchange,提问作者Alessandro Dias
相关产品推荐
相关产品推荐

