重构perl sub以获得可测试性

时间:2016-05-10 17:10:07

标签: perl unit-testing refactoring

我继承了一个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方法是什么?

1 个答案:

答案 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);