1

问候,

我正在尝试为 Mason 组件开发一些测试,这些测试需要在命令行而不是 Web 服务器上运行它们。当我尝试这个时,我得到一个错误:

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::Mason 1.35。

编辑:让我们为此尝试一个赏金。另一种选择是我必须深入梅森的内脏!:)

再次编辑:非常感谢David指出了我错过的关键细节。

这实际上是用于一个测试框架,它需要运行一个调用一些 Mason 组合的模块——在正常操作下,该模块提供有一个用于该目的的 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 对象在调用它时尚未构建组件堆栈。改用从独立脚本中使用 MasonInterp->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 回答