1

ご挨拶、

Webサーバーではなくコマンドラインで実行する必要があるMasonコンポーネントのテストを開発しようとしています。これを試してみると、エラーが発生します。

perl -MHTML::Mason::Request -MHTML::Mason::Interp -I./lib \
-e '$int = HTML::Mason::Interp->new( data_dir => "/home/friedo/cache", comp_root => "/home/friedo/comps" ); $m = HTML::Mason::Request->new( comp => "/dummy", interp => $int ); $m->comp("/dummy")'

結果:

Can't call method "dir_path" on an undefined value at lib/HTML/Mason/Request.pm line 1123.

->compの呼び出しが試行されると、エラーがスローされます。構成の何が問題なのかわかりません。コンポーネントはそこにあり、正常にコンパイルされているように見え、Apacheを介して動作します。

これはHTML::Mason1.35を使用しています。

編集:これの報奨金を試してみましょう。別の方法は、メイソンの内臓を深く掘り下げる必要があることです。:)

もう一度編集してください:これを機能させるために私が見逃した重要な詳細を指摘してくれたDavidに感謝します。

これは実際には、いくつかのMason compを呼び出すモジュールを実行する必要があるテストフレームワーク用でした。通常の操作では、モジュールにはその目的で使用するMasonリクエストオブジェクトが提供されますが、オフラインで動作させることはできませんでした。キーは代わりにInterpreterオブジェクトを使用していたので、私は次のことを行うことになりました。これは少しばかげていますが、テストは機能します。

sub _mason_out { 
   ...
   my $buf;
   if ( $ENV{MASON_TEST} ) { 
       my $int = HTML::Mason::Interp->new( comp_root  => $self->{env}->comp_dir,
                                           out_method => \$buf );

       $int->exec( $comp, %args );
   } else { 
       my $m = $self->{mason_object};
       $m->comp( { store => \$buf }, $comp, %args );
   }

   return $buf;
}
4

1 に答える 1

2

Requestオブジェクトは、呼び出された時点でコンポーネントスタックを構築していないため、これは失敗すると思います。Interp->exec()代わりに、スタンドアロンスクリプトからのメイソンの使用で説明されている方法を使用してください

perl -MHTML::Mason::Interp -I./lib \
-e 'HTML::Mason::Interp->new( data_dir => "/home/friedo/cache", comp_root => "/home/friedo/comps" )->exec("/dummy")'
于 2009-11-16T10:20:05.243 に答える