代码之家  ›  专栏  ›  技术社区  ›  friedo

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

  •  1
  • friedo  · 技术社区  · 16 年前

    问候语,

    我正在尝试为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请求对象用于此目的,但是我不能让它离线工作。密钥使用的是一个解释器对象,所以我最终做了以下的工作,这有点愚蠢,但可以使测试工作正常:

    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 回复  |  直到 16 年前
        1
  •  2
  •   David    16 年前

    我认为这会失败,因为您的请求对象在调用组件堆栈时没有构建组件堆栈。使用 Interp->exec() 方法,如中所述 Using Mason from a Standalone Script

    perl -MHTML::Mason::Interp -I./lib \
    -e 'HTML::Mason::Interp->new( data_dir => "/home/friedo/cache", comp_root => "/home/friedo/comps" )->exec("/dummy")'