как смоделировать func внутри thefile.pl вместо модуля - PullRequest
2 голосов
/ 24 сентября 2019

В сценарии, в котором было бы неплохо не изменять код, а добавлять тесты

проверяемый код thefile.pl

get_name{
    return 'sth';
}

test test_thefile.t

use Test::More;
use Test::MockModule;
require thefile.pl
my $module = Test::MockModule->new('thefile.pl')
$module->mock(get_name => sub { return 'othername' });
my $name = get_name();
ok($name eq 'othername');

Я получил

Invalid package name thefile.pl

1 Ответ

4 голосов
/ 24 сентября 2019

Ваша проблема в том, что вы используете имя файла как пустое слово, поэтому Perl интерпретирует его как имя пакета.Поскольку . не является символом допустимого идентификатора (символ, который вы можете использовать в имени пакета), вы получите это предупреждение.

Если вы хотите использовать имя файла, используйте вместо него строку:

require 'file.pl';

Затем при вызове Test::MockModule он ожидает имя пакета, который вы определили в file.pl , а не имя файла.

НадеюсьЯ не знаю, что вы делаете, но когда я хочу заменить определение подпрограммы, я просто переопределяю это.Это суть идеи, и есть способы сделать это временно.Код интерфейсов, таких как Test::MockModule и Hook::LexWrap, не так уж и сложен:

BEGIN {
    require 'file.pl';

    package Some::Package;
    no warnings 'redefine';
    *get_name = sub { ... }
    }

Глобус (*get_name) немного сложен, но почти все остальное уже отображается втвой пример.Я показываю некоторые из этих приемов в Эффективном программировании на Perl .Для моей работы сокращение списка зависимостей модуля (особенно в тестах) часто стоит продвинутого трюка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...