首页 > 解决方案 > Perl6 通用代码来测试模块是否加载

问题描述

这是/t中的通用代码代码,用于测试/lib中的 .pm6 模块是否加载。

use lib $*PROGRAM.sibling('../lib');
use Test;

my @dir = dir($*PROGRAM.sibling('../lib'), test => { $_ ~~ /.*pm6/  } );
plan @dir.elems;

sub module( IO $dir ) {
  $dir.basename.Str ~~ /(\w+)\.pm6/;
  return $0.Str;
}

for  @dir.map(&module) -> $module {
  use-ok $module, "This module loads: $module";
}

在继续之前(递归查看 lib 子文件夹),我想知道这是正确的方法。

谢谢!

标签: testingmoduleraku

解决方案


如果您正在测试格式良好的分布,那么您应该使用:

use lib $*PROGRAM.parent(2);

通过指向use lib包含 META6.json 的目录而不是lib目录,您可以帮助确保 META6.json 文件的提供条目是最新的(因为 META6.json 中未列出但确实存在于其中的文件lib不会见过)。

我什至会更进一步说根本不要使用use lib '...',而是使用perl6 -I .... ? )

话虽如此,您可以使用 META6 数据跳过目录递归。一种方法是直接读取 META6.json,但更好的方法是从发行版本身获取模块名称:

# file: zef/t/my-test.t
# cwd: zef/

use lib $*PROGRAM.parent(2); # or better: perl6 -I. t/my-test.t
use Test;

my $known-module = CompUnit::DependencySpecification.new(short-name => "Zef");
my $comp-unit    = $*REPO.resolve($known-module);
my @module-names = $comp-unit.distribution.meta<provides>.keys;

use-ok($_) for @module-names;

推荐阅读