2010-09-09 36 views
10

我想單元測試一個使用反引號的Perl程序。有沒有辦法嘲弄反引號,以便他們做一些與執行外部命令不同的東西?如何模擬Perl的內置反引號操作符?

Another question shows what I need,但在Ruby中。不幸的是,我不能選擇在這個項目中使用Ruby,也不想避免反引號。

+1

你能澄清一下「我不想避免反引號」嗎? – Ether 2010-09-09 16:47:17

+0

與此有着密切的關係 - 我經常使用系統寫一個東西,或者是倒過來,然後意識到我想檢查我打出的命令。我曾想過創建系統的診斷版本。 – justintime 2010-09-09 16:50:44

+0

@justintime:修補IPC :: System :: Simple使用$ DEBUG標誌將是非常受歡迎的,我想。 – Ether 2010-09-09 17:03:24

回答

15

你可以 *模擬內置readpipe功能。當遇到反引號或qx表達式時,Perl會調用你的模擬函數。

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

這似乎只適用於後來的perls。 5.8.8只打印foo作爲'readpipe(...)'而不是反引號或'qx'。按照5.10.1所示工作 – 2010-09-09 19:46:57

+0

好抓Eric。這在5.8.9更改:http://search.cpan.org/~jesse/perl-5.12.2/pod/perl589delta.pod#readpipe_is_now_overridable – mob 2010-09-09 19:59:28

+1

另一個好的catch:http://stackoverflow.com/questions/11027832 – mob 2012-06-14 15:42:11

2

而不是使用反引號,你可以使用captureIPC::System::Simple,然後在單元測試中寫一個模擬版本的capture()。

# 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

如果你打算調用一個子程序,只需編寫你自己的包裝器,這樣你就不必模擬了。 – 2010-09-09 20:09:59