[英]Perl unit testing: check if a string is an array
我有这个功能,我想测试:
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' );
有一段时间, smartmatch运营商承诺将解决这个问题......
ok( $strings ~~ /BACK/ )
但它已经声名狼借 ,应谨慎使用(并且no warnings 'experimental::smartmatch'
)。
您的getStringIDs()
方法返回数组引用。
正则表达式绑定运算符( =~
)需要左侧的字符串。 因此它将您的数组引用转换为字符串。 字符串化的数组引用看起来像ARRAY(0x1ff4a68)
。 它没有给你任何数组的内容。
您可以通过解除引用( @$strings
)从数组引用( $strings
)到数组。 您可以通过将数组放在双引号( "@$strings"
)中来对数组进行字符串化。
所以你可以这样做:
ok("@$strings" =~ /BACK/);
但我怀疑,你想要那里的单词边界标记:
ok("@$strings" =~ /\bBACK\b/);
你可能也喜欢like()
测试功能。
like("@$strings", qr[\bBACK\b], 'Strings array contains BACK');
更新:另一种方法是使用grep
检查您的一个数组元素是否为字符串“BACK”。
# Note: grep in scalar context returns the number of elements
# for which the block evaluated as 'true'. If we don't care how
# many elements are "BACK", we can just check that return value
# for truth with ok(). If we care that it's exactly 1, we should
# use is(..., 1) instead.
ok(grep { $_ eq 'BACK' } @$strings, 'Strings array contains BACK');
更新2:嗯...你在这里使用常量的事实使这变得复杂。 常量是子例程,正则表达式是字符串,子例程不以字符串形式插入。
in
运营商是你的朋友。
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.