如何更改单元测试模块中的 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?
到目前为止,我在互联网上找到的唯一帮助是 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?