1

配列を返す関数をテストしています。配列は環境によって異なる場合がありますが、常に少なくとも 1 つの定数値 (テストしたい値) が含まれます。

Perl 5.12 を使用しているので、smartmatch 演算子を使用して、要素が配列内にあるかどうかを確認できます。

ok($known_value ~~ @returned, 'testing method abc')

しかし、「見つかった」部分と「期待された」部分を使用したisandの強化された出力が気に入っています。likeだから私はこれを試しました:

cmp_ok($known_value, '~~', @returned, 'testing method abc')

cmp_ok比較の両方の部分でスカラー を期待しているように見えるため、これは機能しません。

not ok 1 - testing method abc
#   Failed test 'testing method abc'
#   at abc.t line 53.
#     'stable_value'
#         ~~
#     '2'

"expected" スロットの配列は、スカラー コンテキストで評価され、2 に変換されます。

配列を使用して文字列化するハックでこれを回避likeできますが、スマートマッチ演算子を比較方法として使用できるテストがあるwhenとよいでしょう ( など)。Test::More または他のモジュールでこれを行う方法はありますか?

現時点で私は使用しています:

ok($known_value ~~ @returned, 'testing method abc')
  or diag (
      "ERROR:\n".
      "Found: ". Dumper @returned."\n".
      "Expected at least one element equal to '$known_value'"
  )

これは私ができる最善のことですか?

4

3 に答える 3

10

@returnedPerl が引数をサブルーチンに渡す方法のため、使用できません。(配列は引数リストにフラット化され、ID が失われます。) 代わりに配列参照を渡します。

cmp_ok($known_value, '~~', \@returned, 'testing method abc')

スマートマッチ演算子は、正しいことを行うのに十分スマートです。perlsyn から:

スマート マッチは、bless されていないハッシュまたは配列参照を暗黙的に逆参照することに注意してください。そのため、"Hash" および "Array" エントリがこれらの場合に適用されます。

于 2010-10-11T14:23:09.227 に答える
3

Test::Deep(おそらく非常に深くネストされた) 構造の一部をテストするための多くのユーティリティを提供し、障害が発生した場合に非常に役立つ診断も生成します。bagその機能の1つがあなたのために仕事をすることができると私は信じています.

use Test::Deep;

my @foo = ('bar', 'baz', 'moo');

cmp_deeply(
    \@foo,
    superbagof('baz'),
    '@foo contains at least one "baz"',
);

こうすることで、必要になった場合に、物事をより小さなチャンクに分割することなく、スマートマッチングが可能にするよりもはるかに複雑なアサーションを行うことができ、古い perl でも引き続き機能します。

于 2010-10-11T14:35:13.640 に答える
2

Test::MoreTest::Mostによる自動ダンプ:

use Test::More 0.82; diag explain \@returned;

use Test::Most 0.21; show \@returned;
于 2010-10-11T14:32:16.897 に答える