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

rin*_*t.6 2 php phpunit symfony

我不知道如何设置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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

如何设置模拟日期?

Jak*_*umi 5

根据源代码(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());
Run Code Online (Sandbox Code Playgroud)