如何将Perl匿名函数传入Test::More的can_ok进行单元测试?
问题:如何用Test::More测试模块中的匿名函数?
我在模块Foo.pm中定义了匿名函数,示例代码如下:
our $anon = sub { my $parameter = shift; return $parameter * $parameter; };
使用Test::More编写单元测试时,普通子程序可以用can_ok("Foo", @subs)(@subs包含子程序名称)测试,但针对匿名函数执行can_ok("Foo", '$anon')时,出现错误:
Foo->can('$anon') failed
请问是否有办法解引用这些匿名函数并传入can_ok()?
解决方案
can_ok的作用是检测包/类是否包含命名子程序,而你定义的$anon是包级变量,存储的是代码引用,并非包的子程序,所以直接用can_ok检测变量名肯定会失败。可以用以下几种方式测试:
验证变量是代码引用:
使用isa_ok检查包变量的类型,确认它是有效的代码引用:use Foo; isa_ok($Foo::anon, 'CODE', 'Foo包中的$anon是有效的代码引用');添加访问器子程序配合can_ok:
如果一定要用can_ok的形式,可以在Foo.pm中添加一个访问匿名函数的命名子程序:# 在Foo.pm中新增 sub get_anon { return $anon; }然后在测试代码中:
can_ok('Foo', 'get_anon'); # 检测访问器子程序存在 isa_ok(Foo::get_anon(), 'CODE', 'get_anon返回正确的代码引用');直接测试匿名函数的功能:
单元测试的核心是验证逻辑正确性,直接调用匿名函数并断言结果才是最直接的方式:is($Foo::anon->(3), 9, '匿名函数计算平方结果正确'); is($Foo::anon->(-2), 4, '负数平方计算逻辑正确');
内容的提问来源于stack exchange,提问作者noah
相关产品推荐
相关产品推荐

