Perl 我可以在Test::More的cmp\u中使用智能匹配吗?

Perl 我可以在Test::More的cmp\u中使用智能匹配吗?,perl,testing,smartmatch,Perl,Testing,Smartmatch,我正在测试一个返回数组的函数。数组可能因环境而异,但它始终至少有一个常量值,即我要测试的常量值 在使用Perl 5.12时,我可以使用smartmatch操作符查找元素是否在数组中: ok($known_value ~~ @returned, 'testing method abc') 但我喜欢is的增强输出,喜欢找到的和预期的部件。所以我试了一下: cmp_ok($known_value, '~~', @returned, 'testing method abc') 这不起作用,因为cmp

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

在使用Perl 5.12时,我可以使用smartmatch操作符查找元素是否在数组中:

ok($known_value ~~ @returned, 'testing method abc')
但我喜欢is的增强输出,喜欢找到的和预期的部件。所以我试了一下:

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

我可以通过使用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'"
  )
这是我能做的最好的了吗?

您不能使用@returned,因为Perl是如何将参数传递给子例程的。数组被展平到参数列表中并失去其标识。改为传递数组引用:

cmp_ok($known_value, '~~', \@returned, 'testing method abc')
智能匹配操作员足够聪明,可以做正确的事情。来自帕尔森:

请注意,智能匹配是隐式的 取消引用任何不受祝福的哈希或 数组ref,因此哈希和数组 条目适用于这些情况

不能使用@returned,因为Perl是如何将参数传递给子例程的。数组被展平到参数列表中并失去其标识。改为传递数组引用:

cmp_ok($known_value, '~~', \@returned, 'testing method abc')
智能匹配操作员足够聪明,可以做正确的事情。来自帕尔森:

请注意,智能匹配是隐式的 取消引用任何不受祝福的哈希或 数组ref,因此哈希和数组 条目适用于这些情况

自动倾卸,带:

自动倾卸,带:

提供了许多实用程序,用于测试可能嵌套非常深的结构的部件,并在出现故障时生成非常有用的诊断。我相信它的一个行李功能可以帮你完成这项工作

use Test::Deep;

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

cmp_deeply(
    \@foo,
    superbagof('baz'),
    '@foo contains at least one "baz"',
);
这样,如果有必要,您可以执行比smartmatching所允许的复杂得多的断言,而无需将内容分解为更小的块,并且还可以继续在旧的PERL上运行。

提供了许多实用程序,用于测试可能嵌套非常深的结构的部分,并在出现故障时提供非常有用的诊断。我相信它的一个行李功能可以帮你完成这项工作

use Test::Deep;

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

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

通过这种方式,如果有必要,您可以执行比smartmatching允许的复杂得多的断言,而无需将内容分解为更小的块,并且还可以继续在旧的Perl上运行。

傻我!在编辑之前,我再次查看perlsync,并注意到智能匹配隐式地取消引用任何非祝福哈希或数组引用,因此哈希和数组条目适用于这些情况。我一直在看那张纸条,但我都没注意到:第一次看后,我总是看着桌子[在没有引用示例的情况下。非常感谢您修复我的忽略。愚蠢的我!在您编辑之前,我再次查看perlsync,我读到一条注释,智能匹配隐式地取消引用任何未受祝福的哈希或数组引用,因此哈希和数组条目适用于这些情况。我一直在查看该注释,我都没有看到它吴:在我第一次读它之后,我总是看着桌子[在没有引用示例的情况下。非常感谢您修复了我的忽略。谢谢,Rafl,很高兴知道这种方法。我在前一段时间尝试了Test::Deep->cmp_Deeph来比较两个数组,这很好,但Test::More->is_Deeph对我来说更好,因为我想知道结构的不同之处,而不是告诉我它们有不同的n元素的数量。我将更深入地阅读文档,看看我可以从这个模块向我的工具集添加什么。@Pablo:cmp\u Deeph应该告诉你差异在哪里。另外,来自Test::differences的eq\u或diff也类似。@Pablo:没有深入查看cmp\u的源代码或文档,我不知道。谢谢,Rafl,很高兴知道他的方法。我在前一段时间尝试了Test::Deep->cmp_Deeph来比较两个数组,这很好,但Test::More->is_Deeph对我来说更好,因为我想知道结构开始不同的地方,而不是告诉我它们有不同数量的元素。我将更深入地阅读文档,看看我可以从中向工具集添加什么s模块。@Pablo:cmp\u Deep应该告诉您差异在哪里。另外,来自Test::differences的eq\u或_diff也很相似。@Pablo:没有深入查看cmp\u的源代码或文档,我不知道。谢谢daxim,我已经看到explain自2008年以来一直在Test::More中出现!!也许我应该更频繁地重读模块文档以了解更多信息避免遗漏好的新功能;-比 ks daxim,我已经看到解释在测试中::自2008年以来更多!!也许我应该更经常地重读模块文档,以避免遗漏一些好的新特性-