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

完整Mojolicious应用可通过routes命令导出路由,Lite测试脚本如何实现?

在Mojolicious Lite测试脚本中实现路由导出功能

熟悉Mojolicious的朋友都知道,完整的Mojolicious应用可以通过执行命令 script/my_app.pl routes 轻松导出应用的所有路由。但如果是在Mojolicious Lite的测试脚本里,要怎么实现类似的路由导出功能呢?比如下面这个测试脚本,我们需要在标注位置补上实现代码:

use Mojo::Base -strict;
use Test::Mojo;
use Test::More;
use Mojolicious::Lite;

# 此处定义你的路由
get '/' => sub { shift->render(text => 'Hello World') };
get '/user/:id' => sub { shift->render(text => 'User #' . shift->param('id')) };

my $t = Test::Mojo->new;
# 此处需要实现路由导出逻辑

实现方法

其实很简单,我们可以直接访问Test::Mojo对象里的应用实例,调用它的路由相关方法来实现导出,这里提供两种实用方案:

方案一:手动遍历路由(灵活定制输出格式)

如果你需要自定义路由的输出样式,可以自己递归遍历路由树,按需格式化内容:

# 获取应用的根路由对象
my $routes = $t->app->routes;

# 递归遍历并打印路由的子节点
sub dump_route {
  my ($route, $depth) = @_;
  $depth //= 0;
  # 用缩进体现路由层级
  my $indent = '  ' x $depth;
  
  # 整理路由的HTTP方法、路径和名称
  my $methods = join ', ', @{$route->methods // []} || '*';
  my $path = $route->to_string;
  my $name = $route->name || '-';
  
  say "${indent}${methods} ${path} (${name})";
  
  # 递归处理子路由
  dump_route($_, $depth + 1) for @{$route->children};
}

# 启动路由遍历输出
dump_route($routes);

方案二:复用官方路由命令的输出逻辑

如果想和script/my_app.pl routes命令的输出格式完全一致,可以直接复用Mojolicious内置的命令逻辑,不需要自己写遍历:

# 加载官方的routes命令模块
use Mojolicious::Command::routes;

# 创建命令实例并传入当前应用,执行路由导出
Mojolicious::Command::routes->new(app => $t->app)->run;

执行测试脚本后,就能得到和官方命令完全相同格式的路由列表了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:00