我需要测试一个包含这一行的功能:
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)
my $*DISTRO = ...
Run Code Online (Sandbox Code Playgroud)
希望修改原件是不必要的.这通常是不合理的行动 - 几乎可以肯定的是,如果有人安排它是一个不可改变的价值.这就是全球变量声名狼借的原因.
详细说明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\nmy $*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\nRun Code Online (Sandbox Code Playgroud)\n