Perl的排序单元测试

时间:2016-04-19 03:14:06

标签: perl sorting

我尝试在Object中使用(类)方法来排序对象实例。

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]);
}

我在perldoc -f sort中看到了这个代码段,因此是_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.

这只是我的测试设置还是不能在这些数组中拥有相同的对象? 我还缺少什么?

1 个答案:

答案 0 :(得分:6)

您的问题不是传递给sort()的子程序,而是传递给is_deeply()的参数。如果我们添加一些括号,你写它的方式会像这样解析:

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

也就是说,您告诉sort()对包含两个匿名数组引用的列表执行操作,然后使用从is_deeply()返回的单个参数运行sort(除了它is_deeply()之前崩溃可以试图运行并抱怨你给它的参数太少而无法使用)。

这可能更接近你的意图:

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

也就是说,告诉is_deeply()比较两个匿名数组,第一个是通过告诉sort()将您的排序例程应用到列表($feb, $mar, $jan)