Как проверить отсутствующие необязательные модули Perl с помощью вызова Perl из командной строки - PullRequest
0 голосов
/ 22 октября 2018

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

Недавно я добавил необязательную зависимость от третьейсторонний модуль, который не является частью ядра Perl.Я знаю, что мой модуль работает независимо от того, установлен этот модуль или нет, потому что у меня есть компьютер с ним и один без него, и модуль работает без ошибок в каждом случае.Тем не менее, я хотел бы иметь возможность написать тест, чтобы подтвердить, что мой модуль будет работать, когда сторонний модуль отсутствует - и я бы хотел, чтобы этот тест работал, даже если сторонний модуль равен установлен, но ведет себя так, как будто это не так.

В идеале, я мог бы использовать структуру, которую я создал для тестирования, которая выполняет системный вызов шаблонного скрипта.Я знаю, что мог бы написать отдельный тестовый скрипт, который манипулирует @INC в блоке BEGIN, импортирует конкретные методы, использующие модуль, и вызывает их как модульный тест.Но я хотел бы знать, есть ли способ использовать структуру тестов, в которой я уже использовал все остальные мои тесты, а именно совершать системный вызов.

Так есть ли способ исключить модульот импорта через опцию командной строки perl?Я пробовал -M-Module, но код use Module все еще импортирует модуль.

Кстати, мой модуль использует сторонний модуль внутри eval, что я и сделал его необязательным.

1 Ответ

0 голосов
/ 22 октября 2018

Я написал Test :: Without :: Module для этого точного случая.Он работает путем изменения @INC, чтобы предотвратить загрузку названных вами модулей.Для тестирования вы можете либо запустить тест из командной строки:

perl -MTest::Without::Module=Some::Module -w -Iblib/lib t/SomeModule.t

, либо разрешить / запретить загрузку модуля из вашего набора тестов:

use Test::Without::Module qw( My::Module );

# Now, loading of My::Module fails :
eval { require My::Module; };
warn $@ if $@;

# Now it works again
eval q{ no Test::Without::Module qw( My::Module ) };
eval { require My::Module; };
print "Found My::Module" unless $@;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...