2 votes

Comment tester les modules perl optionnels manquants via l'appel perl en ligne de commande

J'ai une suite de tests avec des centaines de tests pour un module perl que je n'ai pas encore publié et qui est une interface de ligne de commande. Comme il s'agit d'une interface de ligne de commande, les tests (jusqu'à présent peut-être) sont tous écrits pour déposer du code dans un modèle et ensuite appeler le modèle script en utilisant un appel système.

J'ai récemment ajouté une dépendance optionnelle sur un module tiers qui ne fait pas partie du noyau de Perl. Je sais que mon module fonctionne, que ce module soit installé ou non, car j'ai un ordinateur sur lequel il est installé et un autre sans et le module fonctionne sans erreur dans chaque cas. Cependant, j'aimerais pouvoir écrire un test pour confirmer que mon module fonctionne lorsque le module tiers est absent - et j'aimerais que ce test fonctionne même si le module tiers est installé. est installé, mais se comporte comme s'il ne l'était pas.

Idéalement, je pourrais utiliser la structure que j'ai mise en place pour les tests qui fait un appel système à un modèle script. Je sais que je pourrais écrire un test séparé script qui manipule @INC dans le bloc BEGIN, importe les méthodes particulières qui utilisent le module, et les appelle comme un test unitaire. Mais j'aimerais savoir s'il existe un moyen d'utiliser la structure de test que j'ai déjà fait utiliser à tous mes autres tests, qui consiste à faire un appel système.

Existe-t-il un moyen d'exclure un module de l'importation via une option de ligne de commande perl ? J'ai essayé -M-Module, mais le code use Module importe toujours le module.

Par ailleurs, mon module utilise le module tiers à l'intérieur d'un eval, c'est pourquoi je l'ai rendu optionnel.

4voto

Corion Points 3649

J'ai écrit Test::Without::Module pour ce cas précis. Il fonctionne en modifiant @INC pour empêcher le chargement des modules que vous nommez. Pour les tests, vous pouvez soit exécuter le test depuis la ligne de commande :

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

Ou autoriser/interdire le chargement du module à partir de votre suite de tests :

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 $@;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X