2009-09-30 8 views
4

J'ajoute actuellement des tests unitaires à un code existant et je me retrouve avec la nécessité de surcharger une fonction ouverte. Le code live ressemble à ceci.Comment puis-je remplacer la fonction open() de Perl mais utiliser le même handle de fichier pour le test?

if (!open(F, $filetoopen)){ 
    # do stuff with <F> 
} 

Ce que je veux faire est de faire en sorte que « F » contient un descripteur de fichier que j'ai fourni de mes tests plutôt que ce qu'il pense son ouverture.

J'ai le code suivant dans mon fichier .T ...

BEGIN { 
    *CORE::GLOBAL::open = sub { open(F,$testfiletoopen); }; 
}; 

... il fonctionne et le code dans le test se termine en lisant de mon dossier de test. Cependant, il ne continuera à fonctionner que si j'utilise le même nom de fichier "F" que le code en test.

S'il existe un moyen de rendre ce code de test moins fragile de sorte que si le nom du handle de fichier est modifié dans le code live, le test n'échouera pas?

Merci

Répondre

9

Pourquoi ne pas utiliser simplement les paramètres de votre code en direct fournit à ouvrir? Gardez à l'esprit que cela va se casser horriblement dès que vous utilisez la forme de trois arguments d'ouvrir. Si quoi que ce soit, cette question offre encore plus de preuves que la version à trois arguments est supérieure.

+1

Merci c'est presque ce dont j'ai besoin sub {open (@_ [0], $ newfilename)}; fonctionne – Vagnerr

+0

Ah! Maintenant je comprends. Je vais modifier ma réponse en conséquence. – innaM

+0

D'accord, vous devriez utiliser la forme à trois arguments de open, et utiliser les handles de fichiers lexicaux: ... sub {open $ _ [0], $ _ [1], $ newfilename} – Ether

Questions connexes