Как я могу издеваться над Log::Log4perl::INFO?

Я пишу новые модульные тесты для существующего модуля, который использует 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;

Мут.т

#!/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...
}

person bstpierre    schedule 23.06.2011    source источник
comment
$log4perl все еще находится в области видимости, когда вы запускаете тесты?   -  person Qtax    schedule 23.06.2011
comment
@Qtax: да. Показанные операторы находятся в области действия файла (несколько строк над ними находится my $log4perl).   -  person bstpierre    schedule 23.06.2011


Ответы (2)


Я посмотрел, что делает 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' );
}
person bstpierre    schedule 23.06.2011

Существует Test::Log:: Модуль Log4perl на CPAN, который позволяет отправлять сообщения, которые, как вы ожидаете, будут зарегистрированы в виде фрагмента кода, и сравнивать его с тем, что было записано на самом деле.

person undefinedvariable    schedule 13.05.2014