加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

重构perl sub以获得可测试性

发布时间:2020-12-16 06:21:11 所属栏目:大数据 来源:网络整理
导读:我继承了一个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.
我继承了一个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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读