为什么Test :: WWW :: Mechanize :: PSGI使用端口?

Ovi*_*vid 9 perl catalyst plack psgi

我有一些看起来像这样的代码:

use SomeApp;
use Test::WWW::Mechanize::PSGI;                                                                                                                                         
my $mech = Test::WWW::Mechanize::PSGI->new(
    app  => sub { SomeApp->run(@_) },
);
$mech->get_ok('/');
Run Code Online (Sandbox Code Playgroud)

但是,一旦get_ok()调用,我收到以下警告:

PSGI error: failed to listen to port 8080: Address already in use at .../5.18.1/HTTP/Server/PSGI.pm line 94.
HTTP::Server::PSGI::setup_listener('HTTP::Server::PSGI=HASH(0x7fe6622fad60)') called at .../5.18.1/HTTP/Server/PSGI.pm line 54
Run Code Online (Sandbox Code Playgroud)

是的,我正在使用那个端口做其他事情.来自Test :: WWW :: Mechanize :: PSGI的文档:

此模块允许您测试PSGI Web应用程序,但不需要服务器或发出HTTP请求.相反,它将HTTP请求对象直接传递给PSGI.

所以从理论上讲,我不需要指定一个端口,但是我得到了上面的警告,并且获取的页面返回了500(它们在浏览器中工作正常).我错过了什么?

  • 测试:: WWW :: Mechanize :: PSGI版本0.35
  • Plack版本1.0030
  • Catalyst版本5.90051

更改MyApp->runMyApp->psgi_app结果:

Can't call method "request" on an undefined value at .../5.18.1/Test/WWW/Mechanize/PSGI.pm line 47.
Run Code Online (Sandbox Code Playgroud)

可以使用以下命令复制此错误:

catalyst.pl MyApp
cd MyApp
# run the test program above
Run Code Online (Sandbox Code Playgroud)

miy*_*awa 15

Catalyst的run方法实际上会运行HTTP服务器(通过Plack/PSGI!)进行开发,这不是你想通过PSGI进行测试(不运行服务器).你需要:app => MyApp->psgi_app,没有额外的sub块,因为psgi_app据说可以返回PSGI应用程序本身.

当您的应用返回根据PSGI规范不正确的内容时,错误消息"无法调用方法'请求'on ..."是一个常见错误.该消息在git master上有所改进,但它本质上是一个用户错误,因为你基本上sub { $app }只是在期望的时候返回$app.

有关使用Catalyst的PSGI支持的更多文档可用perldoc Catalyst::PSGI.

  • 谢谢.使用`MyApp-> psgi_app`而没有子解决它.这是我一直在尝试升级的遗留应用程序,正如你在推特上推测的那样,我发现有很多微小的变化. (2认同)