Perl的排序单元测试

Rob*_*ert 2 sorting perl

我尝试在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]);
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了这个片段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;
Run Code Online (Sandbox Code Playgroud)

但是,转储的参数看起来很奇怪:

$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]
    ];
Run Code Online (Sandbox Code Playgroud)

并且测试失败了

#   Failed test 'sorting died (Not a HASH reference at sort.t line 16.)'
#   at sort.t line 25.
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*ahl 6

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

is_deeply(
        sort(Something::_sort [$feb, $mar, $jan], [$jan, $feb, $mar] )
    );
Run Code Online (Sandbox Code Playgroud)

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

这可能更符合您的意图:

is_deeply(
          [sort(Something::_sort ($feb, $mar, $jan))],
          [$jan, $feb, $mar]);
Run Code Online (Sandbox Code Playgroud)

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