首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么测试::MockObject使我的对象解冻抛出警告?

为什么测试::MockObject使我的对象解冻抛出警告?
EN

Stack Overflow用户
提问于 2013-11-13 22:12:42
回答 1查看 54关注 0票数 1

这件事首先需要解释一下。我有一个单元测试,在这里我使用类别::Std::Fast::Storable保存来自SOAP::WSDL可存储对象。我存储的对象是webservice调用的结果。最后用MIME::Base64 64进行编码,并将其写入文件中。效果很好。

在构建单元测试时,我需要使用测试:MockObject来模拟was服务的调用,从而返回还原的对象。但不知怎么的,这会引发一堆关于在散列元素中使用未初始化值的警告。

我试着把它作为一个小例子重新创造出来。第一段代码是如何获得示例的base64输出的。我们马上就用。

代码语言:javascript
复制
use strict;
use warnings;
use MIME::Base64;
use Storable;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;

my $object = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new;
$object->set_value('foo');
print encode_base64(Storable::freeze($object));

所以我们有三行base64。让我们尝试恢复它们:

代码语言:javascript
复制
use strict;
use warnings;
use MIME::Base64;
use Storable;
use Test::Simple tests => 1;

local $/ = undef;
my $object = Storable::thaw(decode_base64(<DATA>));
ok( $object->get_value, 'foo' );

__DATA__
BAgIMTIzNDU2NzgECAgIE0ADAQAAAAQDAQAAAAoDZm9vBQAAAHZhbHVlMAAAAFNPQVA6OldTREw6
OlhTRDo6VHlwZWxpYjo6QnVpbHRpbjo6YW55U2ltcGxlVHlwZYAwU09BUDo6V1NETDo6WFNEOjpU
eXBlbGliOjpCdWlsdGluOjphbnlTaW1wbGVUeXBlEAQICDEyMzQ1Njc4BAgICAUBAAAAAQ==

干净利落。它起作用了!

代码语言:javascript
复制
~> perl foo.t
1..1
ok 1 - foo

现在让我们添加Test::MockObject。

代码语言:javascript
复制
use strict;
use warnings;
use MIME::Base64;
use Storable;
use Test::Simple tests => 1;
use Test::MockObject; # <------- only line I changed

local $/ = undef;
my $object = Storable::thaw(decode_base64(<DATA>));
ok( $object->get_value, 'foo' );

__DATA__
BAgIMTIzNDU2NzgECAgIE0ADAQAAAAQDAQAAAAoDZm9vBQAAAHZhbHVlMAAAAFNPQVA6OldTREw6
OlhTRDo6VHlwZWxpYjo6QnVpbHRpbjo6YW55U2ltcGxlVHlwZYAwU09BUDo6V1NETDo6WFNEOjpU
eXBlbGliOjpCdWlsdGluOjphbnlTaW1wbGVUeXBlEAQICDEyMzQ1Njc4BAgICAUBAAAAAQ==

好吧这太奇怪了。它可以工作,但它会抛出一个错误。

代码语言:javascript
复制
1..1
Use of uninitialized value in hash element at /usr/lib/perl5/site_perl/5.16.2/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm line 53, <DATA> chunk 1.
ok 1 - foo

所以我看了看anySimpleType.pm第53行,上面写着:

代码语言:javascript
复制
my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF();

sub new {
    my $self = pop @{ $OBJECT_CACHE_REF->{ $_[0] } }; # <-- here
    $self = bless \(my $o = Class::Std::Fast::ID()), $_[0]
        if not defined $self;

嗯。$_[0]是undef.看起来new是在没有参数的情况下被调用的。

但是加载测试::MockObject是怎么做到的呢?或者这个警告总是会突然出现,但不知怎么的,它以前没有被显示出来?我对它进行了一些调试,结果显示,无论加载了什么,Komodo调试器中总是会显示警告。

但是,只有当我也加载了Test::MockObject时,它才会出现在正常的程序输出中。有人能跟我解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-21 15:33:00

我还是不知道为什么会发生这种事。调试使我相信,初始化警告总是由这些可存储对象引发。但是,如果测试::MockObject不存在,他们将保持沉默。

因此,让它闭嘴的解决办法如下:

代码语言:javascript
复制
local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /uninitialized/};
local $/ = undef;
my $object = Storable::thaw(decode_base64(<DATA>));
ok( $object->get_value, 'foo' );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19965494

复制
相关文章

相似问题

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