Arrays Perl单元测试:检查字符串是否是数组
我有一个要测试的函数:Arrays Perl单元测试:检查字符串是否是数组,arrays,perl,unit-testing,Arrays,Perl,Unit Testing,我有一个要测试的函数: use constant NEXT => 'next'; use constant BACK => 'back'; sub getStringIDs { return [ NEXT, BACK ]; } 我尝试编写以下测试,但失败了: subtest 'check if it contains BACK' => sub { use constant BACK => 'back';
use constant NEXT => 'next';
use constant BACK => 'back';
sub getStringIDs {
return [
NEXT,
BACK
];
}
我尝试编写以下测试,但失败了:
subtest 'check if it contains BACK' => sub {
use constant BACK => 'back';
my $strings = $magicObject->getStringIDs();
ok($strings =~ /BACK/);
}
我做错了什么?magicObject->getStringIDs的返回值是数组引用,而不是字符串。看起来您测试的目的是检查数组模式中是否至少有一个元素与
BACK
匹配。执行此操作的方法是通过解引用数组grep
,并检查是否存在非零个匹配项
ok( grep(/BACK/,@$strings) != 0, 'contains BACK' );
有一段时间,政府承诺会解决这个问题
ok( $strings ~~ /BACK/ )
但是它已经并且应该小心使用(并且无警告'experimental::smartmatch'
pragma)。您的getStringIDs()
方法返回数组引用
正则表达式绑定运算符(=~
)需要在其左侧有一个字符串。因此,它将数组引用转换为字符串。字符串化的数组引用类似于数组(0x1ff4a68)
。它不会提供数组的任何内容
通过取消对数组的引用(@$strings
),您可以从数组引用(@$strings
)获取该数组。您可以通过将数组放在双引号(“@$strings”
)中对其进行字符串化
所以你可以这样做:
ok("@$strings" =~ /BACK/);
但我怀疑,你想在里面放单词边界标记:
ok("@$strings" =~ /\bBACK\b/);
您也可能更喜欢like()
测试函数
like("@$strings", qr[\bBACK\b], 'Strings array contains BACK');
更新:另一种选择是使用grep
检查数组元素之一是否为字符串“BACK”
更新2:嗯。。。在这里使用常量的事实使这变得复杂。常量是子例程,正则表达式是字符串,子例程不在字符串中插入。是您的朋友
use Test::More;
use syntax 'in';
use constant NEXT => 'next';
use constant BACK => 'back';
ok BACK |in| [NEXT, BACK], 'BACK is in the arrayref';
done_testing;
为什么在测试中也定义了常数?你想用它实现什么?@simbabque:我猜它们在不同的文件中,并且没有正确导出。@DaveCross我觉得他们想在正则表达式中使用它。我想他们甚至不知道他们可以导出它们。@simbabque:似乎有可能。我可以问你为什么使用
“@$strings”
,而不仅仅是@$strings
(没有引号)?还有,为什么在$\eq'BACK'
中使用引号使用$strings
将所有元素一起运行(NEXTBACK
),而“@strings”
在元素之间放置空格(下一步
)。这允许我们使用\b
查找单个单词。否则,如果数组中包含“FEB”和“ACK”,我们可能会遇到麻烦。@Dave代码中的引号与我对您的问题的评论有关。当您使用m/BACK/
时,返回的是字符串,而不是函数调用(常量只不过是Perl中的函数)。Perl无法在字符串中插入函数调用。您可能应该提到,它们需要安装和模块。
use Test::More;
use syntax 'in';
use constant NEXT => 'next';
use constant BACK => 'back';
ok BACK |in| [NEXT, BACK], 'BACK is in the arrayref';
done_testing;