Общий код Perl6 для проверки загрузки модулей - PullRequest
9 голосов
/ 01 мая 2019

Это общий код в / t для проверки загрузки модулей .pm6 в / lib .

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), я удивляюсь, что это правильный подход.

Спасибо!

Ответы [ 2 ]

10 голосов
/ 01 мая 2019

Если вы тестируете правильно сформированный дистрибутив, вы должны использовать:

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 голосов
/ 05 мая 2019

Используя обратную связь @ugexe и META6-распределение , следующий код в t / проверяет, какие модули определены в 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 .

...