我需要测试includes this line的功能:
if $translate-nl && $*DISTRO.is-win
我试图将一个值重新分配给$ * DISTRO,
$*DISTRO='Windows 10';
但它说:
Cannot modify an immutable Distro (debian (9.stretch))
$*DISTRO
是一个动态变量,没有修改是很有意义的。就是说,还有其他方法可以测试代码(当然,除了Windows之外)
答案 0 :(得分:6)
my $*DISTRO = ...
希望不必修改原稿。 action-at-a-distance通常是不合理的-几乎可以肯定的是,如果有人将其设置为一个不变的值,那就可以了。这就是global variables获得如此糟糕声誉的原因。
答案 1 :(得分:6)
要详细说明raiph的答案:%>%
中的*
将其标记为动态变量。您可以重新声明它的任何作用域,从那里调用的代码将看到重新声明的值:
$*DISTRO
现在,问题仍然存在,您如何代替这些讨厌的{
my $*DISTRO = ...;
# coded called from here sees the redeclared value
}
# code called from here sees the original value
?
在最简单的情况下,一个仅具有受测代码所需的模拟对象:
...
如果代码在{
my class Distro { has $.is-win }
my $*DISTRO = Distro.new( :is-win );
# call your test code here
}
中需要更多属性,只需将它们添加到模拟Distro
类中即可。
如果代码出于某种原因需要“真实* Distro
对象,则可以实例化内置对象。构造器Distro
并未真正记录在案,但the source code makes it pretty obvious what arguments it expects
答案 2 :(得分:-2)
好吧,我的答案比较快。 $*DISTRO
is actually a read-only alias of PROCESS::<$DISTRO>
所以我们只需要做:
my $*DISTRO = Distro.new(:is-win,:release<11>,:path-sep('|||'),:auth<unknown>,:name<mswin32>,:desc<Test>,:version<v11>);
say $*DISTRO.is-win; #OUTPUT: «True»