这件事首先需要解释一下。我有一个单元测试,在这里我使用类别::Std::Fast::Storable保存来自SOAP::WSDL的可存储对象。我存储的对象是webservice调用的结果。最后用MIME::Base64 64进行编码,并将其写入文件中。效果很好。
在构建单元测试时,我需要使用测试:MockObject来模拟was服务的调用,从而返回还原的对象。但不知怎么的,这会引发一堆关于在散列元素中使用未初始化值的警告。
我试着把它作为一个小例子重新创造出来。第一段代码是如何获得示例的base64输出的。我们马上就用。
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。让我们尝试恢复它们:
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==干净利落。它起作用了!
~> perl foo.t
1..1
ok 1 - foo现在让我们添加Test::MockObject。
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==好吧这太奇怪了。它可以工作,但它会抛出一个错误。
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行,上面写着:
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时,它才会出现在正常的程序输出中。有人能跟我解释一下吗?
发布于 2013-11-21 15:33:00
我还是不知道为什么会发生这种事。调试使我相信,初始化警告总是由这些可存储对象引发。但是,如果测试::MockObject不存在,他们将保持沉默。
因此,让它闭嘴的解决办法如下:
local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /uninitialized/};
local $/ = undef;
my $object = Storable::thaw(decode_base64(<DATA>));
ok( $object->get_value, 'foo' );https://stackoverflow.com/questions/19965494
复制相似问题