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