Cal*_*ane 2 phpunit php-7.2 symfony4
我使用 Symfony 的 KernelTestCase 编写单元测试,并且必须测试功能,该功能仅在当天的某个时间(特别早或特别晚)发生。
因此,当我让测试运行一个中午时,当然什么也没有发生。我如何伪造我的系统时间来假装它有不同的时间并且我的测试用例被触发。
我尝试使用 Symfony 的 ClockMock 类,但它不起作用。 https://symfony.com/doc/current/components/phpunit_bridge.html#clock-mocking
这是我的测试代码:
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'
));
}
Run Code Online (Sandbox Code Playgroud)
回声给我今天的日期:2019-02-01 16:02:06
我也有一种感觉,ClockMock 更适合用来跳过时间,例如测试缓存而不是 sleep()。
我究竟做错了什么?
侦听器配置位于我的 phpunit.xml 中,调用 bin/simple-phpunit 会导致发生大量安装。
我不能使用普通的 phpunit 吗?
还有其他选项可以伪造一天中的时间吗?
在您的帖子中包含的链接之后,第一段说:
该桥提供的 ClockMock 类允许您模拟 PHP 的内置时间函数 time()、microtime()、sleep() 和 usleep()。此外,函数 date() 是模拟的,因此如果未指定时间戳,它会使用模拟时间。其他具有可选时间戳参数(默认为 time() )的函数仍将使用系统时间而不是模拟时间。(强调是添加的。)
这意味着您的电话
echo (new DateTime())->format('Y-m-d H:m:s');
Run Code Online (Sandbox Code Playgroud)
预计会给出系统时间,而不是模拟时间。
将其更改为
echo date('Y-m-d H:m:s');
Run Code Online (Sandbox Code Playgroud)
为了满足ClockMock的要求并获得模拟的时间。
注意:我自己从未使用过 ClockMock,但只需查看文档,这应该是了解这是否可以解决您的问题的第一步。