Scroll to navigation

Test::MockDateTime(3pm) User Contributed Perl Documentation Test::MockDateTime(3pm)

NAME

Test::MockDateTime - mock DateTime->now calls during tests

VERSION

version 0.02

SYNOPSIS

    use Test::More;
    use Test::MockDateTime;
    use DateTime;
    
    on '2013-01-02 03:04:05' => sub {
        # inside this block all calls to DateTime::now 
        # will report a mocked date.
        
        my $now = DateTime->now;
        is $now->ymd, '2013-01-02', 'occured now';
    };
    
    done_testing;

DESCRIPTION

Getting the current time sometimes is not very helpful for testing scenarios. Instead, if you could obtain a known value during the runtime of a testcase will make your results predictable.

Why another Date Mocker? I wanted something simple with a very concise usage pattern and a mocked date should only exist and stay constant inside a scope. After leaving the scope the current time should be back. This lead to this tiny module.

This simple module allows faking a given date and time for the runtime of a subsequent code block. By default the "on" keyword is exported into the namespace of the test file. The date to get mocked must be in a format that is recognized by DateTime::Format::DateParse.

    on '2013-01-02 03:04:05', sub { ... };

is basically the same as

    {
        my $now = DateTime::Format::DateParse->parse_datetime(
            '2013-01-02 03:04:05'
        );
        
        local *DateTime::now = sub { $now->clone };
        
        ... everything from code block above
    }

A drawback when relying on this module is that you must know that the module you are testing uses "DateTime->now" to obtain the current time.

FUNCTIONS

on $date_and_time, \&code

mocks date and time and then executes code

CAVEATS

This module only mocks calls to "DateTime->now". All other ways to obtain a current time are not touched.

SEE ALSO

There are some alternatives. Depending on the environment you might consider using one of them instead.

Very universal, overwrites several subs at compile time and allows to set a fixed or ticking time at any place in your code.
Also allows to set a time at various places inside your code.
Mocks several Date::Calc functions.
Also overwrites several subs at compile time.

AUTHOR

Wolfgang Kinkeldei, <wolfgang@kinkeldei.de>

LICENSE

This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself.

2019-10-20 perl v5.30.0