Как я могу издеваться над Log :: Log4perl :: INFO? - PullRequest
2 голосов
/ 23 июня 2011

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

Mut.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...
}

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Я посмотрел на то, что 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' );
}
1 голос
/ 13 мая 2014

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

...