在运行单元测试时,我被告知
Can't locate object method "encode" via package "MockEncodingMethodROT13"
MockEncodingMethodROT13“包”是一个模拟/ stub 的东西。
具体来说,我明白了:
$ prove Test/BFDEn> $ prove Test/BFDEncoder.pm
Test/BFDEncoder.pm .. 1/2# Failed test 'UseMockROT13_getData died (Can't locate object method "encode" via package "MockEncodingMethodROT13" at BFDEncoder.pm line 30.)'
# at /export/home/me/code/base/Test/Rizzo.pm line 41.
# (in Test::BFDEncoder->UseMockROT13_getData)
# Looks like you failed 1 test of 2.
Test/BFDEncoder.pm .. Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/2 subtests
(less 1 skipped subtest: 0 okay)
测试和模拟代码如下所示:
package Test::BFDEncoder;
use Test::More;
use BFDEncoder;
use EncodingMethod;
# use EncodingMethodROT13;
##########
{ package MockEncodingMethodROT13;
use Moose;
extends 'EncodingMethod';
override 'encode' => sub {
my ($self, $data) = @_;
$data =~ tr/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM/;
return $data;
};
}
##########
sub setup : Tests(setup) {
}
sub UseMockROT13_getData : Test(2) {
my $plaintext = BF->new( data => 'Hello World' );
my $rot13 = MockEncodingMethodROT13->new;
my $testee = BFDEncoder->new( decoratedData => $plaintext, encoder => $rot13 );
is ($testee->getData(), 'Uryyb Jbeyq', caller());
is ($plaintext->getData(), 'Hello World', caller());
}
原始的 EncodingMethod(和 EncodingMethodROT13)模块如下所示:package EncodingMethod;
use Moose;
use Carp;
sub encode {
my ($self, $data) = @_;
carp(qq["encode" really should be implemented by a subclass.]);
return $data;
}
1;
和package EncodingMethodROT13;
use Moose;
extends 'EncodingMethod';
override 'encode' => sub {
my ($self, $data) = @_;
$data =~ tr/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM/;
return $data;
};
值得注意的是,使用原始(即非模拟)EncodingMethodROT13 的单元测试工作正常,尽管两者的代码实际上是相同的!我知道它“只是”一个单元测试,当我可以轻松使用原始代码时使用伪造的代码,但我真的很想了解它为什么不起作用。任何想法,任何人?
最佳答案
我相信测试框架在运行前运行测试(也许在 CHECK 时间?)。
但是 override
声明,更重要的是 extends
语句,发生在运行时。
尝试将包定义包装在 BEGIN
的顶部。堵塞。
BEGIN {
package MockEncodingMethodROT13;
use Moose;
extends 'EncodingMethod';
override 'encode' => sub {
my ($self, $data) = @_;
$data =~ tr/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM/;
return $data;
};
}
关于perl - Moose "Can' t 定位对象方法",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486889/