Il existe plusieurs options. L'un est d'utiliser Test::Script pour voir si votre code compile et fonctionne, et fait des choses. Il s'agit plus d'un test d'intégration que d'un test unitaire, et si vous avez des dépendances externes telles que l'écriture sur le système de fichiers, il est difficile de se moquer de ceux-ci comme ça.
Depuis que vous avez sous-marins dans le script, le plus simple est probablement require
ou do
le script dans votre fichier de test, peut-être dans un autre package
(mais cela ne compte pas vraiment). Vous pouvez ensuite appeler ces fonctions, car elles se trouvent dans l'un de vos espaces de noms. De cette façon, vous pouvez simuler plus facilement les dépendances et obtenir plus de contrôle. La seule chose qui pourrait être difficile est le code qui n'est pas dans les sous-marins et sera exécuté à l'appel, comme l'appel à validate_params
. Vous pourrait juste utiliser Capture::Tiny pour brosser que sous le tapis.
La meilleure option est de ne pas avoir de fonctions dans votre script. Faites juste un autre module qui a ces fonctions, et appelez-le dans votre script. C'est bien d'avoir un script comme celui-ci.
#!/usr/bin/env perl
use strict;
use warnings;
use My::Modules::Foo;
My::Modules::Foo->run; # or ::run()
Peu importe que ce soit de la POO ou non. L'idée sera la même. Si vous l'encapsulez correctement, vous pouvez tester tous vos codes sans jamais utiliser ce script. En ce qui concerne les choses GetOpts, ces variables peuvent être des lexiques du script, mais votre nom avec les lettres majuscules et l'absence d'arguments à l'appel validate_params
indiquent qu'ils sont vraiment à l'échelle du paquet et sont utilisés dans la fonction. Ne fais pas ça. Utilisez des arguments à sub
s. Placez tous les sous-marins dans un package
, puis placez GetOpts dans le script et transmettez les options en tant qu'arguments à la fonction.
De cette façon, vous pouvez tout tester et n'avez vraiment pas besoin du script.