2010-09-09 14 views
10

मैं बैकटिक्स का उपयोग कर मेरे एक पर्ल प्रोग्राम का परीक्षण करना चाहता हूं। बैकटिक्स का नकल करने का कोई तरीका है ताकि वे बाहरी कमांड को निष्पादित करने से कुछ अलग कर सकें?मैं पर्ल के अंतर्निर्मित बैकटिक्स ऑपरेटर का नकल कैसे करूं?

Another question shows what I need, लेकिन रूबी में। दुर्भाग्य से, मैं इस परियोजना के लिए रूबी का उपयोग नहीं करना चुन सकता, न ही मैं बैकटिक्स से बचना चाहता हूं।

+1

क्या आप स्पष्टीकरण दे सकते हैं "मैं बैकटिक्स से बचना नहीं चाहता"? – Ether

+0

इससे संबंधित रूप से संबंधित - मैं अक्सर सिस्टम, या बैकटिक्स का उपयोग करके चीजें लिखता हूं, फिर मुझे एहसास होता है कि मैं यह जांचना चाहता हूं कि मैं किस कमांड को बाहर कर रहा हूं। मैंने सिस्टम के नैदानिक ​​संस्करण को क्रेट करने का विचार किया है। – justintime

+0

@justintime: आईपीसी पैचिंग :: सिस्टम :: $ DEBUG ध्वज का उपयोग करने के लिए सरल बहुत स्वागत है, मुझे लगता है। – Ether

उत्तर

15

आप कर सकते हैं * नकली निर्मित readpipe कार्य करते हैं। पर्ल आपके मॉक फ़ंक्शन को कॉल करेगा जब यह बैकटिक्स या 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 

* - अगर आप perl version 5.8.9 या बाद की है।

+0

ऐसा लगता है कि बाद में केवल पीएलएल में ही सही काम करता है। 5.8.8 केवल 'readpipe (...)' के लिए foo प्रिंट करता है और बैकटिक्स या 'qx' नहीं। जैसा दिखाया गया है 5.10.1 –

+0

अच्छा पकड़ एरिक। यह 5.8.9 में बदला गया था: http://search.cpan.org/~jesse/perl-5.12.2/pod/perl589delta.pod#readpipe_is_now_overridable – mob

+1

एक और अच्छी पकड़: http://stackoverflow.com/questions/11027832 – mob

2

बैकटीक्स का उपयोग करने के बजाय, आप captureIPC::System::Simple से उपयोग कर सकते हैं और फिर अपने यूनिट परीक्षण में कैप्चर() का एक नकली संस्करण लिख सकते हैं।

# 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

यदि आप एक सबराउटिन कॉल करने जा रहे हैं, तो बस अपना खुद का रैपर लिखें ताकि आपको बिल्कुल नकल न करें। –

संबंधित मुद्दे