使用Perl框架测试文件i / o

时间:2018-01-08 15:29:49

标签: perl unit-testing mocking

我在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";
}  

1 个答案:

答案 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子句导入。