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

测试嵌套文件夹中的Phoenix控制器遇测试跳过问题求助

排查Elixir伞形应用中Phoenix控制器测试被跳过的问题

嘿,我之前维护伞形应用时也碰到过一模一样的情况——其他测试都正常跑,唯独某个控制器的测试完全被跳过,连个日志都没有。给你几个我亲测有效的排查方向,按顺序试试:

1. 先检查测试文件的「身份合法性」

ExUnit对测试文件的命名和位置有严格要求,不符合的直接忽略:

  • 确保测试文件放在Phoenix子应用的test/controllers/目录下,比如apps/my_phoenix_app/test/controllers/post_controller_test.exs
  • 文件名必须以_test.exs结尾,少一个字母都不行!我之前就犯过把post_controller_test.exs写成post_controller_test.ex的低级错误,结果测试直接隐身
  • 测试模块名要和文件名对应,比如上面的文件模块应该是MyPhoenixApp.PostControllerTest,而且必须开头就写use MyPhoenixApp.ConnCase——没引入ConnCase的话,ExUnit会把它当成普通模块,不会执行里面的测试

2. 检查测试代码的结构

有时候代码写得不对,ExUnit识别不出测试用例:

  • 所有要执行的测试逻辑必须包裹在test "测试描述" do ... end块里!如果不小心把代码写在了test块外面,比如直接在模块里写conn = get(conn, "/posts"),这部分代码只会在模块加载时执行,不会被当成测试用例
  • 有没有不小心加了@tag :skip?或者测试命令带了过滤标签?比如你运行mix test --only :focus,但这个测试没加@tag :focus,就会被跳过。检查测试文件顶部有没有类似@tag skip: "临时跳过"的注解,或者运行测试时的参数

3. 伞形应用的全局测试配置

如果是在根目录运行mix test,要确保根目录的mix.exs没有排除这个测试文件:

  • 检查根目录mix.exs的aliases配置,确保test指令会遍历所有子应用的测试:
    defp aliases do
      [
        test: ["test"] # 默认配置就是这样,别改成只跑某个子应用的测试
      ]
    end
    
  • 看看config/test.exs里有没有全局的排除配置,比如ExUnit.configure(exclude: [:pending]),如果你的测试刚好带了:pending标签,就会被跳过

4. 验证ConnCase的正确性

Phoenix控制器测试依赖ConnCase,如果这个文件有问题,测试也会失效:

  • 打开apps/my_phoenix_app/test/support/conn_case.ex,确认里面正确导入了Phoenix.ConnTest,并且设置了@endpoint MyPhoenixApp.Endpoint
  • 有没有最近修改过ConnCase?比如不小心注释掉了use ExUnit.CaseTemplate,这会导致整个ConnCase失效

5. 直接指定测试文件运行

最后可以用「精准打击」的方式排查:

  • 直接运行这个测试文件:mix test apps/my_phoenix_app/test/controllers/your_controller_test.exs
    • 如果有报错,就跟着错误信息修复(比如依赖缺失、ConnCase配置错误)
    • 如果还是没有任何输出,那90%是文件名、模块名或者标签的问题,再回头检查第一、第二步

我当时是因为文件名少了_test.exs后缀,折腾了快半小时才发现,你可以先从最基础的命名和结构查起,应该很快能解决~

内容的提问来源于stack exchange,提问作者RobStallion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:40:47