我试图在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。而且我无法使用反引号来执行命令。
答案 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";
}
}