2013-07-31 5 views
5

Istnieje świetny moduł Perla Time::HiRes. Mocno używam go w mojej bibliotece i chcę napisać kilka testów. Znalazłem 2 moduły CPAN że kpi perla time() funkcję, ale oboje nie obsługują Time::HiRes:Jak wyśmiać moduł Perla Czas :: HiRes

Jak można drwić Time::HiRes sub gettimeofday()?

PS Chcę naprawić testy mojego modułu Time::ETA. Teraz używam brzydkiego hacka z sleep "mock", sometimes it works and sometimes it does not.

+0

Chcesz coś takiego jak 'set_fixed_time_of_day' sub? – Suic

+0

Myślałem o tym, czego chcę. Chcę móc zatrzymać czas w moim skrypcie testowym. Po uruchomieniu 'my $ ts = CORE :: time(); set_fixed_time ($ ts); '(lub coś w tym stylu)' time() 'i' Time :: HiRes :: gettimeofday() 'zwróci te same wartości, aż ja jawnie uruchomię' $ ts ++; set_fixed_time ($ ts); ' – bessarabov

Odpowiedz

2

Możesz napisać swój własny moduł z blackjackiem i prostytutkami , aby udawać, że gettimeofday. Według niektórych modyfikacjach testów :: MockTime napisałem:

#!/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; 

myślę, że ma dużo błędów i niekompletności funkcjonalność, prace w tym kierunku

+0

Yep =) To jest rozwiązanie. Miałem jednak nadzieję, że ten problem został już rozwiązany. I myślę, że lepiej nie pisać nowego modułu, ale spróbuj poprawić Time :: Mock lub Test :: MockTime. – bessarabov

+0

'użyj Eksportera; * import = \ & Exporter :: import; import(), jeśli 0; 'można zapisać' użyj Exporter qw (import); ' – ikegami

+0

dzięki, był kopiuj-wklej z oryginalnego Test :: MockTime + hack, aby wyłączyć ostrzeżenie) – Suic