如何模拟Perl的内置反引号运算符?

时间:2010-09-09 16:44:09

标签: perl unit-testing backticks qx

我想对使用反引号的我的Perl程序进行单元测试。有没有办法模拟反引号,以便他们可以做一些与执行外部命令不同的东西?

Another question shows what I need,但在Ruby中。不幸的是,我不能选择在这个项目中使用Ruby,也不想避免反复使用。

2 个答案:

答案 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