Я работаю над настройкой тестового скрипта на Perl. Я использую Test :: MockObject, чтобы создать фиктивный объект, который будет содержать некоторые данные конфигурации. Конфигурация в живой программе происходит из INI-файла, то есть имеет формат
[SECTION]
KEY = VALUE
Поэтому я настроил следующее:
use Test::MockObject;
use Data::Dumper qw(Dumper);
use constant SECTION_NAME => 'section';
use constant KEY_NAME => 'key';
use constant VALUE_NAME => 'value';
my $com_mock = Test::MockObject->new();
$com_mock->mock( 'getIniVar', sub {
my $self = shift;
my ( $section, $key ) = @_;
print STDERR "\$_[0] = '" . Dumper( $_[0] ) ." '\n";
print STDERR "\$_[1] = '" . Dumper( $_[1] ) ." '\n";
my %iniVar = ( SECTION_NAME => { KEY_NAME => VALUE_NAME } );
return( $iniVar{$section}->{$key} );
} );
$self->{com} = $com_mock;
Позже я на самом деле вызываю поддельную функцию:
print STDERR
"\$self->{com}->getIniVar( 'section', 'key') = '"
. $self->{com}->getIniVar( SECTION_NAME,KEY_NAME )
. "'\n";
Когда я запускаю тест, я вижу следующее:
ok 1 - use Appriss::ImageExtraction3::Config;
$_[0] = '$VAR1 = 'section';
'
$_[1] = '$VAR1 = 'key';
'
Use of uninitialized value in concatenation (.) or string at t/config/config.pm line 159.
$self->{com}->getIniVar( 'section', 'key') = ''
$_[0] = '$VAR1 = undef;
'
$_[1] = '$VAR1 = 'key';
'
Первый раз, когда вызывается фиктивный объект, во время
use_ok 'Appriss::ImageExtraction3::Config';
Кажется, в этом есть все аргументы, которые я хочу, но я не называю это явно, поэтому я не знаю, что там происходит. Второй раз, когда я явно вызываю его, используя
$self->{com}->getIniVar( SECTION_NAME,KEY_NAME )
(показано выше) ... и на этом этапе первый аргумент устанавливается в undef ... почему?