---
name: "Test::MockDateTime"
section: "3pm"
platform: "linux"
package: "libtest-mockdatetime-perl"
version: "0.02-4"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Test::MockDateTime"
---

# Test::MockDateTime(3pm)

mock DateTime-\>now calls during tests

## 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 several 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.
