完整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
相关产品推荐
相关产品推荐

