2010-03-01 2 views
2

J'ai un objet Perl qui a défini use overload '""' => \&name; et une méthode name.Comment puis-je simuler -f sur un objet en Perl?

Dans mes tests unitaires j'ai raillé cet objet, y compris la méthode name, mais le code comme

if (-d $object) 

me donne encore Use of uninitialized value in -d .... La méthode simulée n'est pas en cours d'exécution.

Mon code Mock:

my $CMmock = Test::MockObject::Extends->new('MyClass'); 
$CMmock->mock('name', sub { print "TEST!\n";});  
$CMmock->mock('""', sub {print "TEST!\n";}); 

D'autres méthodes que j'ai raillé travaillent.

+2

Voir aussi: http://stackoverflow.com/questions/1954529/perl-mocking-df-and-friends-how-to-put-them-into-coreglobal – mob

+0

Intéressant question, mais s'il vous plaît, posez la question appropriée en termes de moquer une classe avec des surcharges. – darch

+0

Merci mobrule, ce lien a résolu mes problèmes. Dommage que je ne l'ai pas trouvé quand j'ai cherché. – Fredrik

Répondre

0

[Excessivement réponse compliquée impliquant evals string élidés.]

overload garde une idée de ce que sont en vigueur les surcharges dans un lieu magique. Parfois, en particulier avec les classes générées dynamiquement, il ne remarque pas de changement. Vous pouvez le forcer à prêter attention en bénissant un objet frais dans la classe. Vous pouvez immédiatement rejeter l'objet; l'événement de bénédiction est ce qui compte. Vous n'avez même pas besoin de stocker l'objet n'importe où. Les travaux suivants pour moi:

use Scalar::Util qw(blessed); 

my $o = Test::MockObject::Extends->new('MyClass') 
     ->mock(name => sub { "Bah!" }) 
; 
bless {} => blessed $o; 

print "$o\n"; 
+0

Cependant, je voudrais noter que la réponse trop compliquée impliquant des évaluations de cordes était assez génial. – darch

+0

Merci pour la réponse. Mais ça ne marche pas pour moi. J'ai probablement mal formulé la question. La réelle moquerie a fonctionné pour moi sauf pour les opérateurs "-f" et "-d". De la question que 'mobrule' lié, il semble que ces opérateurs ne peuvent pas être moqués, du tout. Je vais probablement utiliser une solution où je remplace "-d"/"- f" avec une opération IO :: File et mock IO :: File, ou créer une méthode comme "isFile {shift -f;}" et se moquer de cela à la place. – Fredrik

Questions connexes