【问题标题】:How do I mock Perl's built-in backticks operator?如何模拟 Perl 的内置反引号运算符?
【发布时间】:2011-04-10 08:52:28
【问题描述】:

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

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

【问题讨论】:

  • 你能澄清一下“我不想避免反引号”吗?
  • 与此模糊相关 - 我经常使用系统编写东西,或者 backtics 然后意识到我想检查我正在输出的命令。我曾想过创建一个诊断版本的系统。
  • @justintime:我认为修补 IPC::System::Simple 以使用 $DEBUG 标志会非常受欢迎。
  • 你说“哈哈哈,你是一个愚蠢的内置。”它让它无休止地烦恼。
  • “我也不想避免反引号”。为什么人们如此关心他们使用的语法?为什么使用反引号比在子例程中多写几行来做你需要的事情如此重要,甚至使用像 Git::Wrapper 这样的模块?

标签: perl unit-testing backticks qx


【解决方案1】:

您可以*模拟内置的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 version 5.8.9 或更高版本。

【讨论】:

  • 这似乎只适用于后来的 perls。 5.8.8 只为readpipe(...) 打印foo,而不是反引号或qx。如5.10.1所示工作
  • 很好的埃里克。这在 5.8.9 中已更改:search.cpan.org/~jesse/perl-5.12.2/pod/…
【解决方案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

【讨论】:

  • 如果你要调用一个子例程,只需编写你自己的包装器,这样你就不用模拟了。
猜你喜欢
  • 2015-12-04
  • 2018-01-06
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多