2013-07-31 5 views
5

Существует отличный модуль Perl Time::HiRes. Я сильно использую его в своей библиотеке и хочу написать несколько тестов. Я нашел 2 CPAN модулей, которые высмеивает PERL time() функцию, но оба они не поддерживают Time::HiRes:Как издеваться над модулем Perl Время :: HiRes

Как я могу издеваться Time::HiRes суб gettimeofday()?

PS Я хочу исправить тесты для моего модуля Time::ETA. Теперь я использую уродливый взлом с sleep «макет», sometimes it works and sometimes it does not.

+0

вы хотите что-то вроде 'set_fixed_time_of_day' суб? – Suic

+0

Я думал о том, чего хочу. Я хочу иметь возможность остановить время в своем тестовом скрипте. После запуска 'my $ ts = CORE :: time(); set_fixed_time ($ ts); '(или что-то в этом роде)' time() 'и' Time :: HiRes :: gettimeofday() 'будут возвращать одинаковые значения, пока я не буду явно запускать' $ ts ++; set_fixed_time ($ ts); ' – bessarabov

ответ

2

Вы можете написать свой собственный модуль с блэкджеком и проститутками , чтобы высмеять gettimeofday. По некоторым модификациям Test :: MockTime я писал:

#!/usr/bin/perl 

package myMockTime; 

use strict; 
use warnings; 
use Exporter qw(import); 
use Time::HiRes(); 
use Carp; 

our @fixed =(); 
our $accel = 1; 
our $otime = Time::HiRes::gettimeofday; 

our @EXPORT_OK = qw(
    set_fixed_time_of_day 
    gettimeofday 
    restore 
    throttle 
); 

sub gettimeofday() { 
    if (@fixed) { 
     return wantarray ? @fixed : "$fixed[0].$fixed[1]"; 
    } 
    else { 
     return $otime + ((Time::HiRes::gettimeofday - $otime) * $accel); 
    } 
} 

sub set_fixed_time_of_day { 
    my ($time1, $time2) = @_; 
    if (! defined $time1 || ! defined $time2) { 
     croak('Incorrect usage'); 
    } 
    @fixed = ($time1, $time2); 
} 

sub throttle { 
    my $self = shift @_; 
    return $accel unless @_; 
    my $new = shift @_; 
    $new or croak('Can not set throttle to zero'); 
    $accel = $new; 
} 

sub restore { 
    @fixed =(); 
} 

1; 

Я думаю, что есть много ошибок и неполную функциональность, работа в этом направлении

+0

Yep =) Это решение. Но я надеялся, что эта проблема уже решена. И я думаю, что лучше не писать новый модуль, а попытаться исправить Time :: Mock или Test :: MockTime. – bessarabov

+0

'use Exporter; * import = \ & Exporter :: import; import(), если 0; 'можно написать' use Exporter qw (import); ' – ikegami

+0

спасибо, это была копия-вставка из оригинального теста :: MockTime + hack для отключения предупреждения) – Suic

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