perl test mock make_path

时间:2018-02-09 08:50:27

标签: perl unit-testing perl5

我有一个看起来像下面写的那个功能。我需要为下面的函数编写一个单元测试。我无法嘲笑一些价值观。

use File::Basename;
use File::Copy;
use File::Temp qw(tempdir);
our $CONFIG="/home/chetanv/svf.xml";

copyConfigFiles();

sub copyConfigFiles {
    my $temp_dir = File::Temp->newdir();
    my $targetpath = dirname("$CONFIG");
    `sudo touch $tempdir/myfile`;
    make_path($targetpath) if ( ! -d $targetpath );
    File::Copy::copy("$temp_dir/myfile", $targetpath) or print "Problem copying file";
}

我在下面写了下面的单元测试。我试着嘲笑" makepath"这似乎不起作用。

subtest _setup(testname => "test copyConfigFiles") => sub {

        my $CONFIG = "/my/dir/with/file.xml";
        my $mockfileobj = Test::MockModule->new("File::Temp", no_auto => 1);
        $mockfileobj->mock('newdir', sub { return "/tmp/delme"; } );

        my $amockfileobj = Test::MockModule->new("File::Path", no_auto => 1);
        $amockfileobj->mock('makepath', sub { return 0; } );
        lives_ok { copyConfigFiles () } 'test copyConfigFiles OK';
        done_testing();
    };

问题是我无法模拟以下行。

make_path($targetpath) if ( ! -d $targetpath );
    File::Copy::copy("$temp_dir/myfile", $targetpath) or print "Problem copying file";

有关如何模拟perl特定的makepath函数的任何帮助?我还尝试创建一个临时目录并使用模拟文件模拟全局CONFIG文件。似乎不起作用。

1 个答案:

答案 0 :(得分:2)

如果我忽略了由于缺少上下文而无法运行的代码,并且只关注您想要模拟的两个函数,可以通过临时替换sub中的use warnings; use strict; use Data::Dump; use File::Path qw/make_path/; use File::Copy; sub to_be_mocked { my $targetpath = '/tmp/foo'; make_path($targetpath) if ! -d $targetpath; File::Copy::copy("file.xml", $targetpath) or die; } sub run_with_mock { no warnings 'redefine'; local *make_path = sub { dd 'make_path', @_; return 1 }; local *File::Copy::copy = sub { dd 'copy', @_; return 1 }; to_be_mocked(); } run_with_mock(); __END__ # Output: ("make_path", "/tmp/foo") ("copy", "file.xml", "/tmp/foo") 来实现此目的。 {3}} symbol table

-d

请注意,MM/dd/yyyy'T'HH:mm:ss显然local,至少不是can't be mocked