1

我正在测试一个返回数组的函数。该数组可能因环境而异,但它始终具有至少一个常量值(我要测试的那个)。

当我使用 Perl 5.12 时,我可以使用 smartmatch 运算符来查找元素是否在数组中:

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

is但我喜欢“发现”和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'

“预期”槽中的数组在标量上下文中计算并转换为 2。

我可以通过 hack 使用和字符串化数组来解决这个问题like,但是有一个测试可以使用 smartmatch 运算符作为比较方法(如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

@returned由于 Perl 如何将参数传递给子例程,您不能使用。(数组被展平到参数列表中并失去它们的身份。)改为传递数组引用:

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

智能匹配操作员足够聪明,可以做正确的事情。来自 perlsyn:

请注意,智能匹配会隐式取消引用任何非祝福哈希或数组引用,因此“哈希”和“数组”条目适用于这些情况。

于 2010-10-11T14:23:09.227 回答
3

Test::Deep提供了许多实用程序来测试(可能是非常深的嵌套)结构的一部分,并且在发生故障时也会产生非常有用的诊断。我相信它的一项bag功能可以为您完成这项工作。

use Test::Deep;

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

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

这样,如果事实证明有必要,您可以做比智能匹配允许的更复杂的断言,而不必将事情分解成更小的块,并且还可以继续在旧的 perls 上运行。

于 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 回答