我想对使用反引号的我的Perl程序进行单元测试。有没有办法模拟反引号,以便他们可以做一些与执行外部命令不同的东西?
Another question shows what I need,但在Ruby中。不幸的是,我不能选择在这个项目中使用Ruby,也不想避免反复使用。
答案 0 :(得分:15)
你可以 * 模拟内置的readpipe
函数。 Perl会在遇到反引号或qx
表达式时调用你的mock函数。
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或更晚。
答案 1 :(得分:2)
您可以使用IPC::System::Simple中的capture
,而不是使用反引号,然后在单元测试中编写模拟版本的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