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.

Test::MockTime

Very universal, overwrites several subs at compile time and allows to set a fixed or ticking time at any place in your code.

Time::Mock

Also allows to set a time at various places inside your code.

Test::MockTime::DateCalc

Mocks serveral Date::Calc functions.

Time::Fake

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.