我正在为使用Log::Log4perl的现有模块编写新的单元测试,如:
use Log::Log4perl qw(:easy);该模块调用INFO( "important message" );。我想对此进行模拟,从我的测试代码中验证在某些情况下是否调用了INFO。
当我运行测试模块时,它不会捕获模块对INFO的调用。有什么正确的方法来模拟对INFO的调用
下面是一个完整的例子:
Mut.pm
#!/usr/bin/perl -w
# Mut : Module under test
use strict;
use warnings;
package Mut;
use Log::Log4perl qw(:easy);
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
INFO( "Mut::new" );
return $self;
}
1;mu.t
#!/usr/bin/perl -w
use strict;
use warnings;
package Mut_Test;
use Test::More tests => 1;
use Test::MockModule;
use Test::MockObject;
my @mock_info_output = ();
my $log4perl = Test::MockModule->new('Log::Log4perl');
$log4perl->mock(
'INFO' => sub {
print STDERR $_[0];
push @mock_info_output, @_;
return;
}
);
BEGIN {
use_ok('Mut');
}
{
my $mut = Mut->new;
## Do something here to verify INFO...
}发布于 2011-06-23 15:27:01
我查看了Log4perl.pm在:easy中所做的事情,它修改了调用模块的命名空间,以添加一个记录器和INFO函数(以及其他函数)。
所以我想要覆盖的函数实际上是在Mut.pm中。这个重写的测试模块实现了我想要的。
#!/usr/bin/perl -w
use strict;
use warnings;
package Mut_Test;
use Test::More tests => 2;
use Test::MockModule;
use Test::MockObject;
my @mock_info_output = ();
my $mock;
BEGIN {
use_ok('Mut');
}
$mock = Test::MockModule->new('Mut');
$mock->mock(
'INFO' => sub {
print STDERR "INFO: $_[0]\n";
push @mock_info_output, @_;
return;
}
);
{
my $mut = Mut->new;
is( @mock_info_output, 1, 'just one line' );
}发布于 2014-05-13 17:21:48
CPAN上有一个测试::Log::log4perl模块,它允许您发送您希望记录在代码片段中的消息,并将其与实际记录的消息进行比较。
https://stackoverflow.com/questions/6455806
复制相似问题