【问题标题】:Setting a date/time using Symfony PHPUnit bridge ClockMock使用 Symfony PHPUnit bridge ClockMock 设置日期/时间
【发布时间】:2019-03-31 01:28:41
【问题描述】:

我不知道如何设置 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'),但它仍然返回今天的日期而不是模拟的日期。

如何设置模拟日期?

【问题讨论】:

    标签: php symfony phpunit


    【解决方案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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2011-03-29
      相关资源
      最近更新 更多