9

次のようなコードがあります。

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

はい、そのポートを別の用途に使用しています。Test::WWW::Mechanize::PSGI のドキュメントから:

このモジュールを使用すると、PSGI Web アプリケーションをテストできますが、サーバーや HTTP 要求を発行する必要はありません。代わりに、HTTP 要求オブジェクトを直接 PSGI に渡します。

したがって、理論的にはポートを指定する必要はありませんが、上記の警告が表示され、フェッチされたページは 500 を返します (ブラウザーでは正常に動作します)。私は何が欠けていますか?

  • Test::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
4

2 に答える 2

15

Catalyst のrun方法では、開発のために実際に HTTP サーバー (Plack/PSGI 経由で!) を実行しますが、これは PSGI 経由で (サーバーを実行せずに) テストしたいものではありません。PSGIアプリ自体を返すと思われるためapp => MyApp->psgi_app、追加のsubブロックなしで必要です。psgi_app

エラー メッセージ「Can't call method 'request' on ...」は、アプリが PSGI 仕様に正しくないものを返す場合によくあるエラーです。メッセージは git master で少し改善されましたが、基本的sub { $app }$app.

Catalyst での PSGI サポートに関するその他のドキュメントは、 で入手できますperldoc Catalyst::PSGI

于 2013-12-28T10:36:21.313 に答える