更改$ * DISTRO值进行测试

时间:2018-08-07 17:03:18

标签: testing perl6

我需要测试includes this line的功能:

if $translate-nl && $*DISTRO.is-win

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

$*DISTRO='Windows 10';

但它说:

Cannot modify an immutable Distro (debian (9.stretch))␤

$*DISTRO是一个动态变量,没有修改是很有意义的。就是说,还有其他方法可以测试代码(当然,除了Windows之外)

3 个答案:

答案 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␤»