2016-05-10 1 views
4

Я унаследовал базу данных perl. Рассмотрим следующую подпрограмму;Рефтор perl sub для проверяемости

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 подход к рефакторингу этого юга для проверки?

+4

Посмотреть [Как издеваются встроенный оператор кавычку в Perl?] (HTTP: //stackoverflow.com/q/3678655/176646) – ThisSuitIsBlackNot

+0

Также, на * nix 'netstat -r' просто извлекает данные из/proc/net/route, поэтому вы можете просто разобрать его напрямую. – ThisSuitIsBlackNot

ответ

5

Во-первых, изменить свой код следующим образом:

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

Для насмешливых подпрограмм я предпочитаю использовать http://search.cpan.org/~gfranks/Test-MockModule-0.11/lib/Test/MockModule.pm – bart

 Смежные вопросы

  • Нет связанных вопросов^_^