“在命令行上运行Mason组件时,无法在未定义的值上调用方法”dir_path“

时间:2009-11-11 20:46:22

标签: perl unit-testing apache command-line mason

问候,

我正在尝试为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 comps的模块的测试框架 - 在正常操作下,模块提供了一个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;
}

1 个答案:

答案 0 :(得分:2)

我认为这会失败,因为您的Request对象在调用它时没有构建组件堆栈。请按照Using Mason from a Standalone Script

中的说明使用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")'