我继承了一个perl代码库。考虑以下子例程;
sub getSysRTable
{
my $iface = shift;
return if not length($iface);
my %ip_routes;
my @routes = `/usr/bin/netstat -rn`;
foreach my $route(@routes) {
if ($route =~ /([\S.]+)\s+([\d.]+.[\d.]+.[\d.]+.[\d.]+)\s+(UGS|UGHS)\s+($iface)/ )
{ $ip_routes {$1} = $2 }
}
return %ip_routes;
}
我想为此代码编写单元测试。我想到的测试将使用netstat -rn
的示例输出并检查预期的行为。 sub as is,调用一个命令,因此注入我的测试数据对于这个实现是有问题的。
重构这个sub以实现可测试性的惯用perlish方法是什么?
答案 0 :(得分:5)
首先,按如下方式更改您的代码:
sub getDataForSysRTable {
return `/usr/bin/netstat -rn`;
}
sub getSysRTable
{
my $iface = shift;
return if not length($iface);
my %ip_routes;
my @routes = getDataForSysRTable();
foreach my $route(@routes) {
if ($route =~ /([\S.]+)\s+([\d.]+.[\d.]+.[\d.]+.[\d.]+)\s+(UGS|UGHS)\s+($iface)/ )
{ $ip_routes {$1} = $2 }
}
return %ip_routes;
}
然后进行测试,你可以做到
local *getDataForSysRTable = sub {
... return known data ...
};
my $ip_routes = getSysRTable($iface);