测试嵌套文件夹中的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
相关产品推荐
相关产品推荐

