2

私は次のようなものを使用する既存のモジュールの新しい単体テストを書いています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...
}
4

2 に答える 2

3

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' );
}
于 2011-06-23T15:27:01.437 に答える
1

CPANにはTest::Log :: Log4perlモジュールがあり、コードのスニペットに記録されると予想されるメッセージを送信して、実際に記録されたものと比較できます。

于 2014-05-13T17:21:48.510 に答える