is_deeply проверить игнорирование порядка массива? - PullRequest
6 голосов
/ 02 марта 2012

Я ищу процедуру теста, например is_deeply в Test::More. Есть cmp_bag из Test::Deep, но это работает только с самим массивом, а не с ужасно большой структурой данных hash-of-arrays-of-hashes. 1009 *

is_deeply $got, $expected, {
    array => cmp_bag,
    # and other configuration...
}, "Ugly data structure should be the same, barring array order.";

Разъяснение

Я могу рекурсивно копаться в моих объектах $expected и $got и преобразовывать массивы в объекты-мешки:

sub bagIt {
    my $obj = shift;
    switch (ref($obj)) {
        case "ARRAY"    {
            return bag([
                map { $_ = bagIt($_) }
                @$obj
            ]);
        } case "HASH"   {
            return {
                map { $_ => bagIt( $obj->{$_} ) }
                keys %$obj
            };
        } else {
            return $obj;
        }
    }
}

Мне интересно, есть ли способ сказать какой-то вариант is_deeply сделать это для меня.

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Ну, из Test :: Deep docs , cmp_bag(\@got, \@bag, $name) это просто сокращение для cmp_deeply(\@got, bag(@bag), $name).

is_deeply( $got, {
    array => bag(qw/the values you expect/),
    # and other expected values
}, "Ugly data structure should be the same, barring array order." );
2 голосов
/ 02 марта 2012

Используя написанную вами функцию bagIt, вы всегда можете создать оболочку для is_deeply, которая будет применять bagIt для вас:

sub is_deep_bag {
   splice @_, 1, 1, bagIt($_[1]); 
   goto &is_deeply  # magic goto so that errors are reported on the right line
}
1 голос
/ 20 марта 2012

Похоже, что в Test::Deep или других Test::* пакетах нет возможности рассматривать каждый массив как набор пакетов Следующая функция работает, но неэффективна для тестирования больших структур данных:

sub bagIt {
    my $obj = shift;
    my $ref = ref($obj);
    if ($ref eq 'ARRAY') {
        return Test::Deep::bag(
            map { $_ = bagIt($_) }
            @$obj
        );  
    } elsif ($ref eq 'HASH') {
        return {
            map { $_ => bagIt( $obj->{$_} ) } 
            keys %$obj
        };  
    } else {
        return $obj;
    }   
}

В конце концов, я закончил рефакторинг своего кода, чтобы он не зависел от такого детального теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...