Perl6通用代码,用于测试模块是否加载

问题描述 投票:8回答:2

这是/ 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子文件夹)之前,我想知道这是正确的方法。

谢谢!

testing module perl6
2个回答
10
投票

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

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;

2
投票

使用@ugexe反馈和META6 distribution,t / test中的以下代码测试META6.json中定义的模块加载。

use META6;
use Test;

my $m = META6.new( file => $*PROGRAM.sibling('../META6.json') );
my @modules = $m<provides>.keys;
plan @modules.elems; 

for $m<provides>.keys -> $module {
  use-ok $module, "This module loads: $module";
}

这个测试已被拉入META6 distribution

© www.soinside.com 2019 - 2024. All rights reserved.