我继承了一个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);