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

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

但是,一旦调用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

是的,我正在将该端口用于其他用途。从the docs of Test::WWW::Mechanize::PSGI:



因此,从理论上讲,我不需要指定端口,但是会收到上述警告,并且获取的页面返回500(它们在浏览器中可以正常工作)。我想念什么?
  • 测试::: WWW::Mechanize::PSGI版本0.35
  • Plack版本1.0030
  • Catalyst版本5.90051

  • MyApp->run更改为MyApp->psgi_app会导致:
    Can't call method "request" on an undefined value at .../5.18.1/Test/WWW/Mechanize/PSGI.pm line 47.
    

    可以使用以下方式复制此错误:
    catalyst.pl MyApp
    cd MyApp
    # run the test program above
    

    最佳答案

    Catalyst的run方法实际上将运行HTTP服务器(通过Plack/PSGI!)进行开发,这不是通过PSGI测试(不运行服务器)所不希望的。您需要:app => MyApp->psgi_app,没有额外的sub块,因为psgi_app应该返回PSGI应用程序本身。

    当您的应用返回根据PSGI规范不正确的内容时,错误消息“无法在...上调用方法'request'”是常见的错误。该消息已在git master上进行了一些改进,但这本质上是一个用户错误,因为您基本上在期望sub { $app }时返回$app
    perldoc Catalyst::PSGI提供了有关Catalyst对PSGI支持的更多文档。

    10-07 14:57