首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Test::MockObject::Extends with‘field’出错

Test::MockObject::Extends with‘field’出错
EN

Stack Overflow用户
提问于 2013-04-09 13:55:30
回答 2查看 117关注 0票数 0

因此,尝试升级其他人编写的一些旧测试模块,以支持较新的perls。一些测试正在使用Test::MockObject::Extends,但我发现运行以下代码错误。

代码语言:javascript
复制
#!/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);

错误:

代码语言:javascript
复制
$ 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的一些新东西刚刚照亮了它。

EN

回答 2

Stack Overflow用户

发布于 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想要修改散列,因此轰隆作响。

票数 1
EN

Stack Overflow用户

发布于 2017-08-23 09:38:23

@nfg的答案是正确的,但有一个简单的解决方法:在将哈希传递给Test::Object::Extends之前解锁fields创建的哈希。

代码语言:javascript
复制
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并模拟要截获的任何方法之后,您可能希望重新锁定键,因为否则将不会捕获访问对象中不应存在的字段的错误代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15894298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档