我有以下目录结构(重现问题的简化版本):
testing/
lib/
CLI.pm6
t/
01-test.t
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看来源。问题是,如果您运行,raku -Ilib t/01-test.t您将获得以下输出:
ok 1 - show help message
1..1
ok 1 - no arguments provided
not ok 1 - long version
# Failed test 'long version'
# at site#sources\D2E3739A3B53AD1F7CFEE6DA262613FD174A0BC9 (Test::Output) line 84
# expected a match with: /Documentable\sversion/
# got: "version\r\n"
1..1
# You failed 1 test of 1
not ok 2 - version command
# Failed test 'version command'
# at t\01-test.t line 12
1..2
# You failed 1 test of 2
Execute "documentable --help" for more information.
Run Code Online (Sandbox Code Playgroud)
一切看起来都很正常(显然测试失败了)。问题是最后一行:
Execute "documentable --help" for more information.
Run Code Online (Sandbox Code Playgroud)
该行由CLI::MAIN(),但在测试完成后不执行。您甚至可以评论第一个子测试块,它仍然会出现。这导致使用prove6 -l. 知道发生了什么吗?
更改use CLI;为use CLI {}。
假设CLI找到了包,运行这个:
use CLI;
Run Code Online (Sandbox Code Playgroud)
将显示:
Execute "documentable --help" for more information.
Run Code Online (Sandbox Code Playgroud)
意外输出
以上显然不是您想要的,但是您的测试代码不会改变CLI包的方式use。因此,应该预料到不需要的消息,因为它是按预期MAIN工作的功能。[1]
你的问题归结为:
如何在抑制这些s的自动运行的同时
use使用导出的MAINs包MAIN?
一种简单的解决方案是不导入MAIN(或者更确切地说&MAIN[2]。)
要做到这一点的方法之一是替换use CLI;用use CLI {}。
一个use CLI;语句等价于use CLI :DEFAULT;. (:DEFAULT标签会选择所有带有标签的东西,is export而没有一些不同的标签。)
如果您use CLI {}改为编写,则除了自身之外不会导入任何符号CLI,这些符号将绑定到以包限定形式CLI导出的符号。
这样您的(指定包-- )的手动测试将继续工作,但它的自动调用将被抑制。MAINCLI::MAIN
[1]如果文档没有说清楚:
该is export对our proto MAIN中的声明CLI包出口一个&MAIN[2] 符号;
该use声明进口该&MAIN符号到t/01-test.t的词汇范围;
该命令不带参数raku ... t/01-test.t调用t/01-test.t,也是如此prove6 -l ...(假设除了 lib 之外没有其他参数传递给主线)。因此&MAIN调用零参数调用;
零参数调用解析为零参数multi MAIN() { note 'Execute ... information'; }声明。所以你会看到它的消息。
[2]像这样的子声明MAIN声明了一个符号&MAIN。(以及像调用与 关联的例程的子调用。)MAIN blah blah&MAIN