2010-09-09 14 views
10

Chciałbym przetestować mój program w Perlu, który używa backticks. Czy istnieje sposób na kpiny z backticksów, aby zrobili coś innego niż wykonanie zewnętrznego polecenia?Jak kpić z wbudowanego operatora backlitów Perla?

Another question shows what I need, ale w języku Rubin. Niestety, nie mogę użyć Ruby do tego projektu, ani nie chcę tego uniknąć.

+1

Czy możesz wyjaśnić: "Nie chcę unikać zwrotów"? – Ether

+0

Mało spokrewniony z tym - często piszę rzeczy przy użyciu systemu, lub backtics następnie zdaję sobie sprawę, że chcę sprawdzić, które polecenie puszczę. Myślałem o stworzeniu diagnostycznej wersji systemu. – justintime

+0

@justintime: łatanie IPC :: System :: Myślę, że proste byłoby użycie flagi $ DEBUG. – Ether

Odpowiedz

15

Można * mock wbudowanej readpipe funkcji. Perl wywoła twoją fałszywą funkcję, gdy napotkasz wyrażenie backticks lub 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 

* - jeśli masz perl version 5.8.9 lub później.

+0

Wydaje się, że działa to tylko w późniejszych perłach. 5.8.8 wyświetla tylko foo dla 'readpipe (...)', a nie jako backticks lub 'qx'. Działa jak pokazano w 5.10.1 –

+0

Dobry połów Eric. Zostało to zmienione w 5.8.9: http://search.cpan.org/~jesse/perl-5.12.2/pod/perl589delta.pod#readpipe_is_now_overridable – mob

+1

Kolejny dobry połów: http://stackoverflow.com/questions/11027832 – mob

2

Zamiast używać odrzutów, można użyć capture z IPC::System::Simple, a następnie napisać fałszywą wersję funkcji capture() w teście jednostki.

# 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

Jeśli zamierzasz wywołać podprogram, po prostu napisz własne opakowanie, aby nie musieć w ogóle kpić. –

Powiązane problemy