我需要测试一个功能,即includes this line
if $translate-nl && $*DISTRO.is-win我尝试将一个值重新赋值给$*DISTRO,
$*DISTRO='Windows 10';但上面写着:
Cannot modify an immutable Distro (debian (9.stretch))$*DISTRO是一个动态变量,不修改它是有道理的。也就是说,有没有其他方法可以测试代码(当然,除了Windows之外)
发布于 2018-08-08 03:28:52
my $*DISTRO = ...希望修改原文是不必要的。它通常是不合理的action-at-a-distance --几乎可以肯定的是,如果有人将它设置为不可变值的话。这就是为什么global variables的名声这么差的原因。
发布于 2018-08-09 04:29:03
详述raiph的答案:$*DISTRO中的*将其标记为动态变量。您可以重新声明它的任何作用域,从那里调用的代码将看到重新声明的值:
{
my $*DISTRO = ...;
# coded called from here sees the redeclared value
}
# code called from here sees the original value现在,问题仍然存在,您用什么来取代这些讨厌的...?
在最简单的情况下,mock只包含测试代码所需的所有内容:
{
my class Distro { has $.is-win }
my $*DISTRO = Distro.new( :is-win );
# call your test code here
}如果代码需要Distro中的更多属性,只需将它们添加到模拟Distro类中。
如果代码需要一个“真正的* Distro对象,出于某种原因,你可以实例化一个内置的对象。构造函数.new并没有真正的文档,而是the source code makes it pretty obvious what arguments it expects。
发布于 2018-08-08 01:06:57
好的,我很快就得到了答案。$*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»https://stackoverflow.com/questions/51731999
复制相似问题