2011-02-12 85 views
1

我试图重构我的测试Dist::Zilla::Plugin::Catalyst更加干燥,试图使用驼鹿的任务,但我遇到问题,并为我的生活我无法弄清楚它们是什么,有些似乎是订单初始化问题。有错误的驼鹿模块,需要帮助找到原因

注:代码可能不是最好的,建议表示欢迎

T/01-PluginCatalystNew.t .......无法在在不定值调用方法 “子目录”/家/ xenoterracide /项目/距离 - 吉拉-插件催化剂/ .build/8kE7QQR_FL /吨/ LIB/DZPCshared.pm线26

这里的驼鹿模块,

use strict; 
use warnings; 
package DZPCshared; 
use Path::Class; 
use Moose; 
use namespace::autoclean; 

has 'appname' => (
    is  => 'ro', 
    required => 1, 
); 

has 'tempdir' => (
    is  => 'ro', 
    required => 1, 
); 

has 'directories' => (
    isa  => 'ArrayRef[Str]', 
    traits => ['Array'], 
    is  => 'ro', 
    required => 1, 
    lazy  => 1, 
    default => sub { 
     my $self = shift; 
     my $mr = dir($self->tempdir)->subdir('mint'); 
     my $mrl = $mr->subdir('lib'); 
     my $mrr = $mr->subdir('root'); 
     my $mrs = $mr->subdir('script'); 
     my $mrt = $mr->subdir('t'); 
     my $mrri = $mr->subdir('root')->subdir('static')->subdir('images'); 
     return my $directories = [ $mr, $mrl, $mrr, $mrs, $mrt, $mrri ]; 
    }, 
); 

has 'scripts' => (
    isa  => 'ArrayRef[Str]', 
    traits => ['Array'], 
    is  => 'ro', 
    default => sub { 
     my $self = shift; 
     my ($mr, $mrl, $mrr, $mrs, $mrt, $mrri) = @{ $self->directories }; 
     my $lc_app = lc $self->appname; 
     return my $scripts = [ 
      $mrs->file ($lc_app . '_cgi.pl' ), 
      $mrs->file ($lc_app . '_create.pl' ), 
      $mrs->file ($lc_app . '_fastcgi.pl'), 
      $mrs->file ($lc_app . '_server.pl' ), 
      $mrs->file ($lc_app . '_test.pl' ), 
     ]; 
    }, 
); 

has 'files' => (
    isa  => 'ArrayRef[Str]', 
    traits => ['Array'], 
    is  => 'ro', 
    default => sub { 
     my $self = shift; 
     my ($mr, $mrl, $mrr, $mrs, $mrt, $mrri) = @{ $self->directories }; 
     my $lc_app = lc $self->appname; 
     return my $files = [ 
      $mr->file ($lc_app . '.conf'    ), 
      $mrl->file ($self->app_name . '.pm'    ), 
      $mrl->subdir($self->app_name)->subdir('Controller')->file('Root.pm'), 
      $mrr->file ('favicon.ico'     ), 
      $mrri->file ('btn_120x50_built.png'   ), 
      $mrri->file ('btn_120x50_built_shadow.png' ), 
      $mrri->file ('btn_120x50_powered.png'  ), 
      $mrri->file ('btn_120x50_powered_shadow.png'), 
      $mrri->file ('btn_88x31_built.png'   ), 
      $mrri->file ('btn_88x31_built_shadow.png' ), 
      $mrri->file ('btn_88x31_powered.png'  ), 
      $mrri->file ('btn_88x31_powered_shadow.png' ), 
      $mrri->file ('catalyst_logo.png'   ), 
      $mrt->file ('01app.t'      ), 
     ]; 
    }, 
); 

__PACKAGE__->meta->make_immutable; 
1; 

和测试

#!/usr/bin/perl 
use strict; 
use warnings; 
use Test::More; 

if ($Moose::VERSION >= 1.9902 and $Moose::VERSION < 2.0) { 
    plan skip_all => 'Module is broken on Devel Moose, don\'t test'; 
} 

use Dist::Zilla::Tester; 
use Path::Class; 
use FindBin; 
use lib "$FindBin::Bin/lib"; 
use DZPCshared; 

my $tzil = Minter->_new_from_profile(
    [ Default => 'default' ], 
    { name => 'CatApp' }, 
    { global_config_root => dir('corpus/mint')->absolute }, 
); 

$tzil->mint_dist; 

my $dzpcs = DZPCshared->new({ 
    appname => $tzil->name, 
    tempdir => $tzil->tempdir, 
}); 

subtest 'catalyst files exist' => sub { 
    my $should_exists = [ @{$dzpcs->files}, @{$dzpcs->scripts} ]; 

    foreach (@{$should_exists}) { 
     ok (-e $_ , "$_" . ' exists'); 
    } 
}; 

subtest 'catalyst scripts should be executable' => sub { 
    plan skip_all => 'skip failing executable tests on windows' if $^O eq 'MSWin32'; 
    my $should_exec = @{$dzpcs->scripts}; 

    foreach (@{$should_exec}) { 
     ok (-x $_ , "$_" . ' exists'); 
    } 
}; 
done_testing; 

(注:p.s.不知道一个最小的测试用例,可以在此)

(注:也previous version工作)

回答

5

我打了一下你的代码 - 你必须在非懒使用属性directories属性default。因为在实例完全构建之前调用了directories的默认值。因此,第26行的$self->tempdirundef,并且您收到了错误消息。

我做scriptsfiles属性懒惰,似乎工作(它抛出验证错误上的目录 - 你有ArrayRef[Str],但构建ArrayRef[Path::Class::Dir]代替 - 但是这不涉及到当前的问题)。

+0

谢谢,这让我疯狂。我想我必须尝试过所有的组合,但是......或者因为我有其他错误,我只是感到困惑。我花了另一个小时的工作,并设法铲除最后的错误 – xenoterracide 2011-02-13 03:51:37