更改$*DISTRO值以进行测试

jjm*_*elo 5 testing perl6

我需要测试一个包含这一行的功能:

if $translate-nl && $*DISTRO.is-win
Run Code Online (Sandbox Code Playgroud)

我试图将值重新分配给$*DISTRO,

$*DISTRO='Windows 10';
Run Code Online (Sandbox Code Playgroud)

但它说:

Cannot modify an immutable Distro (debian (9.stretch))?
Run Code Online (Sandbox Code Playgroud)

$*DISTRO是一个动态变量,它没有被修改是有意义的.也就是说,有没有其他方法可以测试代码(当然,除了转到Windows)

rai*_*iph 6

my $*DISTRO = ...
Run Code Online (Sandbox Code Playgroud)

希望修改原件是不必要的.这通常是不合理的行动 - 几乎可以肯定的是,如果有人安排它是一个不可改变的价值.这就是全球变量声名狼借的原因.


mor*_*itz 6

详细说明raiph的答案:*in将其$*DISTRO标记为动态变量.您可以将其重新声明为任何范围,从那里调用的代码将看到重新声明的值:

{
    my $*DISTRO = ...;
    # coded called from here sees the redeclared value
}
# code called from here sees the original value
Run Code Online (Sandbox Code Playgroud)

现在,问题仍然存在,你用什么代替这些讨厌的东西...

在最简单的情况下,模拟只需要测试所需的代码:

{
    my class Distro { has $.is-win }
    my $*DISTRO = Distro.new( :is-win );
    # call your test code here
}
Run Code Online (Sandbox Code Playgroud)

如果代码需要更多属性Distro,只需将它们添加到mock Distro类中.

如果代码需要一个"真正的*Distro对象,由于某种原因,你可以实例化内置的那个.构造函数.new没有真正记录,但是源代码很明显它所期望的参数.


jjm*_*elo -2

\n好的,我很快就得到了答案。$*DISTRO实际上是一个只读别名PROCESS::<$DISTRO>

\n\n

所以我们只需要做:

\n\n
my $*DISTRO = Distro.new(:is-win,:release<11>,:path-sep(\'|||\'),:auth<unknown>,:name<mswin32>,:desc<Test>,:version<v11>);\nsay $*DISTRO.is-win; #OUTPUT: \xc2\xabTrue\xe2\x90\xa4\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n

  • 不,我不会这样做,因为这就是“远距离操作”的定义:这将适用于为所有线程运行的“所有”代码。正确的方法是执行 `my $*DISTRO = Distro.new(:is-win,:release&lt;11&gt;,:path-sep('|||'),:auth&lt;unknown&gt;,:name &lt;mswin32&gt;,:desc&lt;Test&gt;,:version&lt;v11&gt;);` 在您需要让 `$*DISTRO` 假装它是 Windows 系统的范围内。 (2认同)