12

我想对我的一个使用反引号的 Perl 程序进行单元测试。有没有办法模拟反引号,以便它们执行与执行外部命令不同的操作?

另一个问题显示了我需要什么,但在 Ruby 中。不幸的是,我不能选择在这个项目中使用 Ruby,也不想避免反引号。

4

2 回答 2

19

您可以*模拟内置readpipe函数。Perl 将在遇到反引号或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 版本 5.8.9或更高版本。

于 2010-09-09T16:51:35.567 回答
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
于 2010-09-09T16:47:39.270 回答