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

标签 php symfony phpunit

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

Additionally the function date() is mocked so it uses the mocked time if no timestamp is specified. Other functions with an optional timestamp parameter that defaults to time() will still use the system time instead of the mocked 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') 但它仍然返回今天的日期而不是模拟日期。

如何设置模拟日期?

最佳答案

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

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

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

关于php - 使用 Symfony PHPUnit 桥 ClockMock 设置日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437106/

相关文章:

javascript - PayPal JavaScript SDK 客户端不发布到服务器

javascript - 发送问题 -> 加密 -> 使用 jQuery 和 PHP 获取

php - Doctrine DBAL 可以与 ORM Query Builder 混合使用吗?

PHPUnit:在 <ClassNameTest>.php 中找不到类 <ClassName>

php - 在 Symfony 中使用自定义数据库数据设置功能测试

php - 在php中的数据库中设置 session

PHP MYSQL 基于变量显示表列

symfony - 更改 Sonata Admin 上的左侧菜单标签

php - 字符串保存到数据库(mysql)时会被转义

Phpunit,期望一个方法正好运行两次