2016-04-19 20 views
2

オブジェクトのソートのためにObjectで(class)メソッドを使用しようとしています。Perlのソートの単体テスト

package Something; 

use strict; 
use warnings; 
use Data::Dumper; 

sub new { 
    my ($class, $date) = @_; 
    my $self = bless{}, $class; 
    $self->{date} = $date; 
    return $self; 
} 

sub _sort($$) { 
    print STDERR Dumper($_[0], $_[1]); 
    $_[0]->{date} cmp $_[1]->{date}; 
} 

package SomethingTest; 

use base 'Test::Class'; 
use Test::More; 

__PACKAGE__->runtests() unless caller; 

sub sorting : Test { 
    my $jan = Something->new("2016-01-01"); 
    my $feb = Something->new("2016-02-01"); 
    my $mar = Something->new("2016-03-01"); 

    is_deeply(
     sort Something::_sort [$feb, $mar, $jan], 
     [$jan, $feb, $mar]); 
} 

私は_sortため、したがって、プロトタイプ、perldoc -f sortにこのスニペットを見てきました。

# using a prototype allows you to use any comparison subroutine 
# as a sort subroutine (including other package's subroutines) 
package other; 
sub backwards ($$) { $_[1] cmp $_[0]; } # $a and $b are 
             # not set here 
package main; 
@new = sort other::backwards @old; 

はしかし、ダンプの引数は奇妙に見える:

$VAR1 = [ 
     bless({ 
       'date' => '2016-02-01' 
      }, 'Something'), 
     bless({ 
       'date' => '2016-03-01' 
      }, 'Something'), 
     bless({ 
       'date' => '2016-01-01' 
      }, 'Something') 
    ]; 
$VAR2 = [ 
     $VAR1->[2], 
     $VAR1->[0], 
     $VAR1->[1] 
    ]; 

とテストが

# Failed test 'sorting died (Not a HASH reference at sort.t line 16.)' 
# at sort.t line 25. 

で失敗が、この私のテスト・セットアップですか私は、同じオブジェクトを持つことはできませんこれらの配列? 他に何が欠けていますか?

答えて

6

問題は、sort()に渡すサブルーチンではなく、is_deeply()に渡す引数にあります。

ある
is_deeply(
     sort(Something::_sort [$feb, $mar, $jan], [$jan, $feb, $mar]) 
    ); 

は、次の2つの匿名の配列参照からなるリストに作用するsort()を言っているし、その後is_deeply()で実行するために:私たちはいくつかの括弧を追加した場合、あなたが書かれている方法は、それは、このように解析し、単一の引数がsortから返されました(ただし、is_deeply()が実行しようとする前にクラッシュして、使用する引数が少なすぎると不平を言うことができます)。

これはおそらく、あなたが意図したものに近いです:

is_deeply(
      [sort(Something::_sort ($feb, $mar, $jan))], 
      [$jan, $feb, $mar]); 

リスト($feb, $mar, $jan)にあなたの並べ替えルーチンを適用するsort()を言ってから作られている最初のうち2つの匿名の配列を比較するis_deeply()を伝える、すなわち。

+0

ありがとう、私は本当に間違った場所を見ていました。ソートプロトタイプでは2つの引数しか指定されていないので(コードは3)、is_deeply([sort Something :: _ sort $ feb、$ mar、$ jan]、[$ jan、$ feb、 $ mar]); 'は動作します。 – Robert

関連する問題