【发布时间】:2014-01-15 18:31:07
【问题描述】:
我有一些看起来像这样的代码:
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:
此模块允许您测试 PSGI Web 应用程序,但不需要服务器或发出 HTTP 请求。相反,它将 HTTP 请求对象直接传递给 PSGI。
所以理论上,我不需要指定端口,但我收到上述警告,并且获取的页面返回 500(它们在浏览器中工作正常)。我错过了什么?
- Test::WWW::Mechanize::PSGI 0.35 版
- Plack 版本 1.0030
- 催化剂版本 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
【问题讨论】:
-
我不确定
SomeApp包含什么,但你试过Plack::Util::load_psgi吗?my $mech = Test::WWW::Mechanize::PSGI->new(app => Plack::Util::load_psgi('SomeApp')); -
emix:即使是普通的
catalyst.pl SomeApp,也会生成Error while loading MyApp.pm: Setting config after setup has been run is not allowed。我已经发布了一个解决方法作为答案。此外,如果我将它包装在一个子(必需)中并删除“使用 SomeApp”,我会得到Can't call method "request" on an undefined value。