2011-02-12 9 views
1

Dist::Zilla::Plugin::Catalystのテストをリファクタリングして、より多くのDRYを実行しようとしていますが、タスクにMooseを使用しようとしていますが、私は彼らが何であるか把握することができません、そのうちのいくつかは注文の初期化の問題であるように見えました。エラーが発生したモーズモジュールは原因の特定に役立ちます

注:コードは、おそらく最高ではない、提案/で未定義の値に「サブディレクトリ」メソッドを呼び出すことはできません.......

トン/ 01-PluginCatalystNew.t歓迎ホーム/ xenoterracide /プロジェクト/ディスト - ジーラ・プラグイン・触媒/ .build/8kE7QQR_FL/T/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; 

とテスト

(注:p.s.

(注)必ず、最小限のテストケースは、この中で可能ではありません。また、previous versionが働いていた)

答えて

5

私はあなたのコードでビットを果たした - あなたは非怠惰で使用怠惰属性directoriesを持っています属性default。そのため、directoriesのデフォルトは、インスタンスが完全に構築される前に呼び出されます。したがって、行26の$self->tempdirundefであり、エラーメッセージが表示されます。

私は怠け者 scriptsfiles属性を作り、(それがディレクトリで検証エラーがスローされます - あなたは ArrayRef[Str]を持っていますが、代わりに ArrayRef[Path::Class::Dir]を構築する - しかし、これはあなたの現在の問題に関連していない)動作するようです。

+0

ありがとう、これは私を夢中にさせていました。私はすべての組み合わせを試してみたに違いないと思っています...または私はちょうど混乱していた他のエラーがあるので。私は別の時間を費やして作業しました。最後のバグを根絶するために管理しました – xenoterracide

+0

@xenoterracide私はディレクトリのデフォルトハンドラに '$ self'のダンプを追加して、それが空のblessed hashrefであることを認識しました。だから私はいくつかの出力を持つ小さな 'BUILD'メソッドを追加し、実際にBUILDの前にデフォルトのハンドラが呼び出されているのを見ました。 – bvr

関連する問題