使用Symfony PHPUnit桥ClockMock设置日期/时间

时间:2019-03-31 01:28:42

标签: php symfony phpunit

我不知道如何设置ClockMock类使用的日期/时间。在文档中:

  

另外,对函数date()进行了模拟,因此,如果未指定时间戳,则使用模拟的时间。其他具有可选时间戳参数(默认为time())的函数仍将使用系统时间而不是模拟时间。

这是我试图做的:

class Foo
{
    public function now(): string {
        return date('Y-m-d');
    }
}


/**
 * @covers Foo
 * @group time-sensitive
 */
class FooTest extends TestCase
{
    /**
     * @covers Foo::now
     */
    public function testNow(): void {
        ClockMock::register(Foo::class);
        ClockMock::withClockMock('2019-01-01');

        $f = new Foo();
        static::assertSame('2019-01-01', $f->now());
    }
}

断言仍然失败,实际日期为今天的日期。

我什至尝试在测试类的断言中调用date('Y-m-d'),但它仍返回今天的日期,而不是模拟的日期。

如何设置模拟日期?

1 个答案:

答案 0 :(得分:1)

根据源代码(https://github.com/symfony/symfony/blob/4.2/src/Symfony/Bridge/PhpUnit/ClockMock.php#L28),ClockMock::withClockMock()的参数期望一个数字(由is_numeric检查并转换为浮点数)作为其第一个参数,并将其用作时间戳记。如果不是数字,它将使用当前的微时间作为时间戳。

所以您的代码可能应该是:

ClockMock::withClockMock(date_create('2019-01-01')->getTimestamp());