首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何模拟日志::Log4perl::INFO?

我如何模拟日志::Log4perl::INFO?
EN

Stack Overflow用户
提问于 2011-06-23 14:34:01
回答 2查看 599关注 0票数 2

我正在为使用Log::Log4perl的现有模块编写新的单元测试,如:

代码语言:javascript
复制
use Log::Log4perl qw(:easy);

该模块调用INFO( "important message" );。我想对此进行模拟,从我的测试代码中验证在某些情况下是否调用了INFO

当我运行测试模块时,它不会捕获模块对INFO的调用。有什么正确的方法来模拟对INFO的调用

下面是一个完整的例子:

Mut.pm

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

代码语言:javascript
复制
#!/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...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-23 15:27:01

我查看了Log4perl.pm在:easy中所做的事情,它修改了调用模块的命名空间,以添加一个记录器和INFO函数(以及其他函数)。

所以我想要覆盖的函数实际上是在Mut.pm中。这个重写的测试模块实现了我想要的。

代码语言:javascript
复制
#!/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' );
}
票数 3
EN

Stack Overflow用户

发布于 2014-05-13 17:21:48

CPAN上有一个测试::Log::log4perl模块,它允许您发送您希望记录在代码片段中的消息,并将其与实际记录的消息进行比较。

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

https://stackoverflow.com/questions/6455806

复制
相关文章

相似问题

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