gpt4 book ai didi

phpunit - 如何在 phpunit 测试中伪造 DateTime?

转载 作者:行者123 更新时间:2023-12-02 03:22:02 26 4
gpt4 key购买 nike

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'
));
}

echo 告诉我今天的日期:2019-02-01 16:02:06

我也有一种感觉,ClockMock 更适合用来跳过时间,例如:测试缓存而不是 sleep()。

我做错了什么?

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

我不能使用普通的phpunit吗?

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

最佳答案

在您的帖子中包含的链接之后,第一段内容如下:

The ClockMock class provided by this bridge allows you to mock the PHP's built-in time functions time(), microtime(), sleep() and usleep(). 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. (Emphasis added.)

这意味着您的调用

echo (new DateTime())->format('Y-m-d H:m:s');

预计给出系统时间,而不是模拟时间。

更改为

echo date('Y-m-d H:m:s');

为了满足ClockMock的要求,得到模拟的时间。

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

关于phpunit - 如何在 phpunit 测试中伪造 DateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54482611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com