如何对 Raku 中的模块未导出的子组件进行单元测试?

Ste*_*ieD 6 raku

得到这个代码:

unit module Command::CanRun;

enum OS <win nix>;

sub determine-os {
    return 'nix' when $*SPEC.gist.contains('unix', :i);
    return 'win' when $*DISTRO.is-win;
}
Run Code Online (Sandbox Code Playgroud)

我想对此进行单元测试:

ok Command::CanRun::determine-os, 'can determine os';

但是,如果不导出子文件,我就无法做到这一点determine-os

Could not find symbol '&determine-os' in 'Command::CanRun'

尚未找到有关如何对模块中的非导出子程序执行此操作的任何指导。谢谢。

Jon*_*ton 9

Asub默认为词法作用域,这意味着它不能从外部访问。人们可以通过将其设置为作用域来通过完全限定的包名称来使其可用our

our sub determine-os {
    return 'nix' when $*SPEC.gist.contains('unix', :i);
    return 'win' when $*DISTRO.is-win;
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是将其导出到标签下(例如,is export(:internals)),这意味着必须显式导入它(use Command::CanRun :internals;),将其排除在模块导出的标准 API 之外。

  • 不,Raku 中的词法作用域确实是严格执行的(因此可以通过分析、优化等来依赖) (2认同)