【问题标题】:can_ok With anonymous functionscan_ok 带匿名函数
【发布时间】:2022-10-19 20:34:40
【问题描述】:

在我的模块 Foo.pm 中,我得到了一些匿名函数,例如

our $anon = sub {
  my $parameter = shift;
  return $parameter * $parameter;
}

我正在使用Test::More 为我的模块中的函数编写单元测试。

对于普通的子程序,我可以使用can_ok("Foo.pm", @subs) 和包含子程序名称的@subs。对于匿名函数,我收到以下错误:

Foo->can('$anon') failed

有没有办法取消引用函数并将它们传递给can_ok()

【问题讨论】:

  • 我不清楚您要测试什么。 can_ok('Foo.pm", "bar") 基本上是在测试您是否可以在 Foo 对象上调用 bar() 方法,即 Foo->bar() 不会崩溃。您要测试什么方法用你的匿名子?你通常如何调用该方法?
  • @DaveMitchell afaik can_ok() 测试是否可以调用方法。在我的示例中,它测试@subs 中的所有方法是否可调用。必须取消引用匿名子例程才能调用它们,例如&$anon($parameter)
  • 所以你本质上想测试 $Foo::anon 是否设置为 coderef? is(ref $Foo::anon, 'CODE') 怎么样?

标签: function unit-testing perl testing anonymous-function


【解决方案1】:

can 通过查看继承和模块组合来确定事物是否可以执行方法。如果您有包含代码引用的包变量,则不能使用这种测试。这没有道理。

您可以测试您的 $anon 是否正确导出。在上面的示例中,您使用的是没有包名的包名,所以我假设您正在导出它。但请记住that Exporter suggests not to export variables

相反,我建议检查包装中是否有符号,以及它的类型是否正确。

isa_ok $Foo::anon, 'CODE';

如果该符号不存在或不是代码引用,则该测试将失败。

要使用子名称列表执行此操作,您可以使用插值,但您必须禁用严格的refs

package Foo;

our $one = sub { 1 };
our $two = sub { 2 };

package main;
use strict;
use warnings;
use Test::More;

for my $sub (qw/ one two three/) {
    no strict 'refs';
    isa_ok ${ "Foo::$sub" }, 'CODE';
}

done_testing;

如果您想要匿名方法,您可能应该遵循约定并用下划线命名它们,例如sub _anon

【讨论】:

  • 有没有一种自动化的方法来测试这个数组?还是我必须手动测试每种方法?
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多