执行包函数的意外输出

Ant*_*ado 6 raku

我有以下目录结构(重现问题的简化版本):

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. 知道发生了什么吗?

rai*_*iph 7

更改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 exportour 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