我有一个看起来像下面写的那个功能。我需要为下面的函数编写一个单元测试。我无法嘲笑一些价值观。
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文件。似乎不起作用。
答案 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。