模拟perl backtick的返回代码和输出

时间:2019-07-15 10:33:31

标签: unit-testing perl mocking

我试图在perl中编写一个单元测试用例,我需要两次模拟通过反引号及其返回代码运行的命令的输出。

考虑如下代码流

sub foo {
  my $out = `ls -R`;
  my $ret = $?;

  if( $ret == 0 ) {
    $out = `ls -R > foo.txt`;
  } elsif {
    # some retry logic
    # i want to cover this code path
  }
  return ($ret, $out);
}

现在我需要模拟非零返回码。 我该如何实现?

我有类似下面的内容,但这仅模拟输出,但返回代码始终为0

BEGIN {
  *CORE::GLOBAL::readpipe = sub($) {
    my $var = $_[0];
    return 1;
  }
};

我正在使用Perl 5.10。而且我无法使用反引号来执行命令。

1 个答案:

答案 0 :(得分:3)

Backticks / readpipe返回$?的退出状态,因此您只想在模拟的readpipe函数中设置$?

BEGIN {
  *CORE::GLOBAL::readpipe = \&mock_readpipe
};
sub mock_readpipe {
  my $var = $_[0];
  if ($var =~ /cat|dog/) {
      $? = 1 >> 8;  # simulate exit code 1
      return;
  } else if (wantarray) {
      $? = 0;
      return ("foo\n", "bar\n");
  } else {
      $? = 0;
      return "foo\nbar\n";
  }
}