Changing $*DISTRO values for testing

情到浓时终转凉″ 提交于 2019-12-23 09:57:08

问题


I need to test a feature that includes this line:

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

I have tried to reassign a value to $*DISTRO,

$*DISTRO='Windows 10';

but it says:

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

$*DISTRO is a dynamic variable, and it makes sense that it's not modified. That said, is there any other way that code can be tested (other than going to Windows, of course)


回答1:


my $*DISTRO = ...

Hopefully modifying the original is unnecessary. It's generally unreasonable action-at-a-distance -- almost certainly so if someone has arranged for it to be an immutable value. This is the reason why global variables got such a bad reputation.




回答2:


To elaborate on raiph's answer: the * in $*DISTRO marks it as a dynamic variable. You can re-declare it any scope, and code called from there will see the redeclared value:

{
    my $*DISTRO = ...;
    # coded called from here sees the redeclared value
}
# code called from here sees the original value

Now, the question remains, what do you put in place of these pesky ...?

In the simplest case, a mock that just has whatever the code under test needs:

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

If the code needs more attributes in Distro, just add them to the mock Distro class.

If the code needs a "real* Distro object, for some reason, you can instantiate the built-in one. The constructor .new isn't really documented, but the source code makes it pretty obvious what arguments it expects.




回答3:


OK, I got the answer relatively fast. $*DISTRO is actually a read-only alias of PROCESS::<$DISTRO>

So we only need to do:

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/changing-distro-values-for-testing

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!