我想單元測試一個使用反引號的Perl程序。有沒有辦法嘲弄反引號,以便他們做一些與執行外部命令不同的東西?如何模擬Perl的內置反引號操作符?
Another question shows what I need,但在Ruby中。不幸的是,我不能選擇在這個項目中使用Ruby,也不想避免反引號。
我想單元測試一個使用反引號的Perl程序。有沒有辦法嘲弄反引號,以便他們做一些與執行外部命令不同的東西?如何模擬Perl的內置反引號操作符?
Another question shows what I need,但在Ruby中。不幸的是,我不能選擇在這個項目中使用Ruby,也不想避免反引號。
你可以 *模擬內置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或更高版本。
這似乎只適用於後來的perls。 5.8.8只打印foo作爲'readpipe(...)'而不是反引號或'qx'。按照5.10.1所示工作 – 2010-09-09 19:46:57
好抓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
另一個好的catch:http://stackoverflow.com/questions/11027832 – mob 2012-06-14 15:42:11
而不是使用反引號,你可以使用capture
IPC::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
如果你打算調用一個子程序,只需編寫你自己的包裝器,這樣你就不必模擬了。 – 2010-09-09 20:09:59
你能澄清一下「我不想避免反引號」嗎? – Ether 2010-09-09 16:47:17
與此有着密切的關係 - 我經常使用系統寫一個東西,或者是倒過來,然後意識到我想檢查我打出的命令。我曾想過創建系統的診斷版本。 – justintime 2010-09-09 16:50:44
@justintime:修補IPC :: System :: Simple使用$ DEBUG標誌將是非常受歡迎的,我想。 – Ether 2010-09-09 17:03:24