2012-03-01 5 views
4

is_deeplyのようなテストルーチンをTest::Moreに探しています。 ありTest::Deepからcmp_bagだが、これが唯一の配列そのものではなく、私が渡している恐ろしく大きなハッシュ・オブ・アレー・オブ・ハッシュデータ構造に作用するようなものがあります:。is_deeply array orderを無視してテストしますか?

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の亜種に私のためにこれを伝える方法があるのだろうかと思います。

+1

[Data :: Rmap](http://search.cpan.org/~bowmanbs/Data-Rmap-0.62/lib/Data/Rmap.pm)を使用してbagItを書き直すことはできますが、余分な依存関係は価値があるとは思えませんコードのいくつかの余分な行...私はそれが答えにあった場合bagItに投票するだろう。 – Dallaylaen

答えて

1

が見えます各アレイをバッグセットとして扱うことができます。以下の機能が動作しますが、大規模なデータ構造の上にテストのための効率的ではありません。

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

最後に、私は、このようなコースグレインテストに依存しないように私のコードをリファクタリングすることになりました。

2

まあ、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."); 
+1

返事をありがとう。明確にするために質問を更新しました。問題は、データ構造をARRAYを手作業でバッグオブジェクトに変換する必要があることです。深い等価性を比較するために、このインラインで行うTest :: * libがあるかどうか疑問に思っています。 – devoid

2

あなたが書いたbagIt機能を使用して、あなたは常にあなたのためbagItを適用is_deeplyのラッパーを作ることができる:Test::Deepまたは他のTest::*内のオプションがないよう

sub is_deep_bag { 
    splice @_, 1, 1, bagIt($_[1]); 
    goto &is_deeply # magic goto so that errors are reported on the right line 
} 
関連する問題