You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:15:32