【问题标题】:Refactor perl sub for testability重构 perl sub 以提高可测试性
【发布时间】:2016-09-05 19:21:36
【问题描述】:

我继承了一个 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 按原样调用命令,因此注入我的测试数据对于此实现是有问题的。

什么是惯用的 perlish 方法来重构这个 sub 以实现可测试性?

【问题讨论】:

标签: perl unit-testing refactoring


【解决方案1】:

首先,将代码更改如下:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
相关资源
最近更新 更多