2013-07-31 32 views
5

Có một mô-đun Perl tuyệt vời Time::HiRes. Tôi sử dụng nó rất nhiều trong thư viện của mình và muốn viết một số bài kiểm tra. Tôi đã tìm thấy 2 module CPAN mà chế giễu perl time() chức năng, nhưng cả hai đều không hỗ trợ Time::HiRes:Làm thế nào để giả lập mô-đun Perl Thời gian :: HiRes

Làm thế nào tôi có thể thử Time::HiRes phụ gettimeofday()?

PS Tôi muốn sửa các thử nghiệm cho mô-đun của mình Time::ETA. Bây giờ tôi sử dụng hack xấu xí với sleep "giả", sometimes it works and sometimes it does not.

+0

nào bạn muốn một cái gì đó như 'tiểu set_fixed_time_of_day'? – Suic

+0

Tôi đã suy nghĩ về những gì tôi muốn. Tôi muốn có thể dừng thời gian trong kịch bản thử nghiệm của mình. Sau khi tôi chạy 'my $ ts = CORE :: time(); set_fixed_time ($ ts); '(hoặc cái gì đó tương tự)' time() 'và' Time :: HiRes :: gettimeofday() 'sẽ trả về cùng giá trị cho đến khi tôi chạy' $ ts ++; set_fixed_time ($ ts); ' – bessarabov

Trả lời

2

Bạn có thể viết mô-đun của riêng mình với blackjack và hookers để thử gettimeofday. Theo một số thay đổi của Test :: MockTime i đã viết:

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

tôi nghĩ rằng nó có rất nhiều lỗi và functionallity không đầy đủ, làm việc theo hướng này

+0

Yep =) Đây là một giải pháp. Nhưng tôi hy vọng rằng vấn đề này đã được giải quyết. Và tôi nghĩ tốt hơn là không viết một mô-đun mới, nhưng cố gắng vá Time :: Mock or Test :: MockTime. – bessarabov

+0

'sử dụng Nhà xuất khẩu; * nhập khẩu = \ & Xuất khẩu :: nhập khẩu; import() nếu 0; 'có thể được viết' sử dụng Exportw qw (import); ' – ikegami

+0

cảm ơn, nó đã được copy-paste từ bản gốc Test :: MockTime + hack để tắt cảnh báo) – Suic