因此,尝试升级其他人编写的一些旧测试模块,以支持较新的perls。一些测试正在使用Test::MockObject::Extends,但我发现运行以下代码错误。
#!/usr/bin/env perl
package MyModule;
use strict;
use warnings;
use fields qw(field1 field2);
sub new {
my $self = shift;
unless (ref $self) {
$self = fields::new($self);
}
return $self;
}
package main;
use strict;
use warnings;
use Test::MockObject::Extends;
use Data::Dumper;
my $VAR1 = MyModule->new();
print Data::Dumper::Dumper($VAR1);
my $VAR2 = Test::MockObject::Extends->new($VAR1);错误:
$ perl a
$VAR1 = bless( {}, 'MyModule' );
Modification of a read-only value attempted at /usr/local/share/perl/5.14.2/Test/MockObject/Extends.pm line 31.我已经查看了Test::MockObject和Perl5.10的changelog,但看不到任何直接导致此问题的原因。我怀疑它已经坏了一段时间了,5.10的一些新东西刚刚照亮了它。
发布于 2013-04-10 01:46:17
我认为这里发生的事情是使用field::new的结果。从perldoc页面:
perl 5.9.0 and higher: fields::new() creates and blesses a restricted-hash comprised of the fields declared using the "fields" pragma into the specified class.
我认为Test::MockObject::Extends想要修改散列,因此轰隆作响。
发布于 2017-08-23 09:38:23
@nfg的答案是正确的,但有一个简单的解决方法:在将哈希传递给Test::Object::Extends之前解锁fields创建的哈希。
use Hash::Util qw(unlock_keys);
my $obj = Some::Class->new();
unlock_keys(%$obj);
$obj = Test::MockObject::Extends->new($obj);如果使用< 5.9的perl,这将失败,因此如果这是一个问题,那么您可以有条件地解锁密钥。
在调用Test::MockObject::Extends并模拟要截获的任何方法之后,您可能希望重新锁定键,因为否则将不会捕获访问对象中不应存在的字段的错误代码。
https://stackoverflow.com/questions/15894298
复制相似问题