繁体   English   中英

Perl单元测试:检查字符串是否为数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM