Intermediate Perlの本を勉強しようとしています。章18 オブジェクト破壊でSUPER ::メソッドのPerlでの分岐割り当てのテスト
は、以下のDESTROY
メソッド定義を導入されています
# lib/Animal.pm
package Animal {
# ...
sub DESTROY {
my $self = shift;
if ($self->{temp_filename}){
my $fh = $self->{temp_fh};
close $fh;
unlink $self->{temp_filename};
}
print '[', $self->name, " has died.]\n";
}
# ...
}
# lib/Horse.pm
package Horse {
use parent qw(Animal)
# ...
sub DESTROY {
my $self = shift;
$self->SUPER::DESTROY if $self->can('SUPER::DESTROY');
print "[", $self->name, " has gone off to the glue factory.]\n";
}
# ...
}
数が失敗した試みの後、私はthis answerに基づいて、このテストを書いた:
# t/Horse.t
#!perl -T
use strict;
use warnings;
use Test::More tests => 6;
use Test::Output;
# some other tests
# test DESTROY() when SUPER::DESTROY is not defined;
{
my $tv_horse = Horse->named('Mr. Ed');
stdout_is(sub { $tv_horse->DESTROY }, "[Mr. Ed has died.]\n[Mr. Ed has gone off to the glue factory.]\n",
'Horse DESTROY() when SUPER::DESTROY is defined');
}
{
my $tv_horse = Horse->named('Mr. Ed');
sub Animal::DESTROY { undef }
stdout_is(sub { $tv_horse->DESTROY }, "[Mr. Ed has gone off to the glue factory.]\n",
'Horse DESTROY() when SUPER::DESTROY is not defined');
}
私がテストすることはできませんメソッドの再定義が前のブロックのテストにも影響を与えているため、両方の場合の出力が正しくなります。
メソッドの再定義が期待どおりに機能するようにする方法をご存知ですか?
おかげ
をサブルーチンを再定義'、' - > can( 'SUPER :: DESTROY')チェックは少し不要になります。私は '$ self-> SUPER :: DESTROY'を直接呼び出しています。 – amon
BtwテストでDESTROYメソッドを直接呼び出してトリガしないでください。DESTROYが複数回呼び出されることがあります。その代わりに、 'undef $ tv_horse'はデストラクタをトリガする変数をクリアします。 – amon
アドバイスありがとうございました – mabe02