【发布时间】:2019-06-26 05:08:44
【问题描述】:
ss我使用 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'
));
}
回声给我今天的日期:2019-02-01 16:02:06
我也觉得 ClockMock 更习惯于跳过时间,例如测试缓存而不是 sleep()。
我做错了什么?
监听器配置在我的 phpunit.xml 中 调用 bin/simple-phpunit 会导致大量安装发生。
不能用普通的phpunit吗?
还有其他方法可以伪造一天中的时间吗?
【问题讨论】: