如何更改单元测试模块中的 Perl Readonly 标量?

How do I change a Perl Readonly scalar in a module for a unit test?

到目前为止,我在互联网上找到的唯一帮助是 this blog。我认为这会让我到达那里,但我认为它实际上并没有改变我模块中的值。我做了一个示例来说明我的意思。

package Module;

use 5.012;
use strict;
use warnings;
use Readonly   qw( );

use parent     qw(Exporter);
our @EXPORT_OK = qw(
   &GetReadonly
);
our %EXPORT_TAGS = (
   all => [ @EXPORT_OK ] );

Readonly::Scalar my $HOST => 'host.web.server.com';

sub GetReadonly
{
   return $HOST;
}

1;

以及测试代码:

#!perl

use strict;
use warnings;
use Test::More 'no_plan';
use Module qw/ :all /;

is($Module::HOST, 'host.web.server.com');     # HOST == undef

my $fake_host = 'fakemail.web.server.com';

{
   no warnings 'redefine';
   local *Readonly::Scalar::STORE = sub { ${$_[0]} = $_[1]; };
   $Module::HOST = $fake_host;
}

is(GetReadonly(), $fake_host);      # Returns host.web.server.com

如果我使用博客中的 Module::HOST,我会收到裸字编译错误。

是否有更好的方法来为单元测试模拟 Readonly?

博客大概是Readonly was implemented in pure Perl using tie以前写的。如今,Readonly 是使用 XS 实现的。要使变量不再只读,您可以调用

Internals::SvREADONLY( $Module::HOST, 0 );

为了能够从模块外部访问变量,必须声明它 our, not my(如博客正确显示的那样)。

但主要问题是:如果变量不应该是可写的,为什么还需要测试变量中的不同值?