Test::MockDateTime - mock DateTime->now calls during tests
version 0.02
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;
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
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.
DateTime->now
mocks date and time and then executes code
This module only mocks calls to DateTime->now. All other ways to obtain a current time are not touched.
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 serveral Date::Calc functions.
Also overwrites several subs at compile time.
Wolfgang Kinkeldei, <wolfgang@kinkeldei.de>
This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself.
To install Test::MockDateTime, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Test::MockDateTime
CPAN shell
perl -MCPAN -e shell install Test::MockDateTime
For more information on module installation, please visit the detailed CPAN module installation guide.