如何在phpunit测试中伪造日期时间?

如何在phpunit测试中伪造日期时间?,phpunit,symfony4,php-7.2,Phpunit,Symfony4,Php 7.2,ssI使用Symfony的内核测试用例编写一个单元测试,并且必须测试一个功能,这只会在一天中的某个特定时间提前或延迟进行 所以当我让我的测试在中午运行时,当然什么也没发生。我怎样才能伪造我的系统时间,假装它有一个不同的时间,我的测试用例被触发 我试过使用Symfony的ClockMock类,但不起作用。 这是我的测试代码: use Symfony\Bridge\PhpUnit\ClockMock; use \DateTime; /** * testUserAchievedEarlyBird

ssI使用Symfony的内核测试用例编写一个单元测试,并且必须测试一个功能,这只会在一天中的某个特定时间提前或延迟进行

所以当我让我的测试在中午运行时,当然什么也没发生。我怎样才能伪造我的系统时间,假装它有一个不同的时间,我的测试用例被触发

我试过使用Symfony的ClockMock类,但不起作用。

这是我的测试代码:

use Symfony\Bridge\PhpUnit\ClockMock;
use \DateTime;

/**
 * testUserAchievedEarlyBirdTrophy
 * @group time-sensitive
 */
public function testUserAchievedEarlyBirdTrophy()
{
    ClockMock::withClockMock(strtotime('2018-11-05 01:00:00'));
    echo (new DateTime())->format('Y-m-d H:m:s');

    $user8Id = $this->user8->getId();
    $progressSaveRequest = new ProgressSaveRequest($user8Id, $this->content_1_1->getId());

    $this->progressService->saveProgress($progressSaveRequest);

    $this->assertTrue($this->loggerCreator->hasDebugThatContains(
        'Early Bird'
    ));
}
回声报给我今天的日期:2019-02-01 16:02:06

我还觉得ClockMock被用来跳过时间,例如测试缓存而不是睡眠

我做错了什么

侦听器配置位于我的phpunit.xml中 调用bin/simple phpunit会导致大量安装发生

我不能用普通的phpunit吗


还有其他方法可以伪造一天中的时间吗?

在你的帖子中包含的链接后面,第一段说:

此桥提供的ClockMock类允许您模拟 PHP的内置时间函数time、microtime、sleep和 美国利普。此外,函数日期是模拟的,因此它使用 如果未指定时间戳,则模拟时间。具有 默认为时间的可选时间戳参数仍将使用 系统时间,而不是模拟时间。 重点补充

这意味着你的

echo (new DateTime())->format('Y-m-d H:m:s');
预计将给系统时间,而不是模拟时间

换成

echo date('Y-m-d H:m:s');
为了符合ClockMock的要求并获得模拟时间


注意:我自己从未使用过ClockMock,但只要看看文档,这应该是第一步,看看这是否解决了您的问题。

太好了!这就是我需要的提示。我现在用我要测试的方法的构造函数中的date方法初始化我的DateTime对象,它工作了$myDate=新日期TimeDate'Y-m-d H:m:s';