gpt4 book ai didi

perl - 重构 perl sub 以提高可测试性

转载 作者:行者123 更新时间:2023-12-05 00:55:59 27 4
gpt4 key购买 nike

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

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

最佳答案

首先,将您的代码更改如下:

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 - 重构 perl sub 以提高可测试性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37144880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com