我在pl脚本中有以下命令:
mkpath($my_dir,0,0777);
我想在执行此命令时遇到错误时测试实例。目前,我将父目录的权限或其他一些此类更改更改为文件系统,以强制执行错误。如果可能的话,如何在不改变物理机器的情况下设置单元测试?我正在阅读Test :: MockModule和Sub :: Override,但没有看到如何在上面使用它。我过去使用过Test :: More,但不是用于模拟或注射。
还有许多其他文件系统调用可能会出现上述错误。
扩展到下面的答案,我想出了如下所示的内容。下面有什么警告吗?我想运行脚本,输入'bad'以确保我正确捕获错误条件。
use warnings;
use strict;
use Test::More;
use Sub::Override;
use File::Path qw{ mkpath };
my $my_dir = "somedir";
my $err_msg = "";
sub testme {
eval {mkpath($my_dir, 0, 0777)};
if ($@) {
$err_msg = "Could not create directory $my_dir. Error was as follows: $@\n";
}
return $err_msg;
}
#The following will be a series of tests for different error conditions when script is run in test mode
{
my $override = 'Sub::Override'->new('mkpath' => sub {
my ($dir, $verbose, $mode) = @_;
if ($dir eq "somedir") { $dir = "/baddir" };
return File::Path::mkpath ($dir,$verbose, $mode);
});
my $res = testme(); #will check result with maybe "is" or "ok"
print "Result of testme sub:$res\n";
}
答案 0 :(得分:0)
#! /usr/bin/perl
use warnings;
use strict;
{
package TestMe;
use File::Path qw{ mkpath };
sub testme {
mkpath('dir', 0, 0777);
}
}
use Test::More;
use Sub::Override;
{
my $override = 'Sub::Override'->new('TestMe::mkpath' => sub {
my ($dir, $verbose, $mode) = @_;
is $dir, 'dir', 'right dir';
is $verbose, 0, 'no verbosity';
is $mode, 0777, 'correct mode';
});
TestMe::testme();
} # End of scope, $overrides si destroyed, original mkpath is restored.
请注意,您在TestMe包中覆盖mkpath,因为它已由use
子句导入。