2010-09-09 18 views
10

Me gustaría poner a prueba un programa mío de Perl que está utilizando palos de retroceso. ¿Hay alguna forma de burlarse de los backticks para que hagan algo diferente de ejecutar el comando externo?¿Cómo me burlo del operador de patillas integradas de Perl?

Another question shows what I need, pero en Ruby. Desafortunadamente, no puedo elegir usar Ruby para este proyecto, ni quiero evitar los backticks.

+1

¿Puedes aclarar "No quiero evitar los backticks"? – Ether

+0

Vagamente relacionado con esto: a menudo escribo cosas usando el sistema o los backtics, luego me doy cuenta de que quiero verificar qué comando estoy copiando. He pensado en crear una versión de diagnóstico del sistema. – justintime

+0

@justintime: parchear IPC :: System :: Fácil de usar una bandera $ DEBUG sería muy bienvenido, creo. – Ether

Respuesta

15

Puede * simulacro de la incorporada en el readpipe función. Perl llamará a su función de simulación cuando encuentre una expresión de backticks o qx.

BEGIN { 
    *CORE::GLOBAL::readpipe = \&mock_readpipe 
}; 

sub mock_readpipe { 
    wantarray ? ("foo\n") : "foo\n"; 
} 

print readpipe("ls -R"); 
print `ls -R`; 
print qx(ls -R); 


$ perl mock-readpipe.pl 
foo 
foo 
foo 

* - si tiene perl version 5.8.9 o posterior.

+0

Esto parece funcionar solo en perls posteriores. 5.8.8 solo imprime foo para 'readpipe (...)' y no para backticks o 'qx'. Funciona como se muestra en 5.10.1 –

+0

Good catch Eric. Esto se modificó en 5.8.9: http://search.cpan.org/~jesse/perl-5.12.2/pod/perl589delta.pod#readpipe_is_now_overridable – mob

+1

Otro buen truco: http://stackoverflow.com/questions/11027832 – mob

2

En lugar de utilizar marcadores, puede usar capture desde IPC::System::Simple, y luego escribir una versión simulada de captura() en su prueba de unidad.

# application 
use IPC::System::Simple qw(capture); 
my $stuff = capture("some command"); 

# test script 
{ 
    package IPC::System::Simple; 
    sub capture 
    { 
     # do something else; perhaps a call to ok() 
    } 
} 

# ... rest of unit test here 
+1

Si va a llamar a una subrutina, simplemente escriba su propia envoltura para que no tenga que burlarse en absoluto. –

Cuestiones relacionadas