重构perl sub以获得可测试性

前端之家收集整理的这篇文章主要介绍了重构perl sub以获得可测试性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我继承了一个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 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);

猜你在找的Perl相关文章