ClockMock 是一个非常有用的工具,用于创建时间敏感的测试,例如如果日期是过去的 A 应该发生,如果是未来的 B 应该发生。
ClockMock 是 phunit-bridge 的一部分,它与 phpunit 8 配合得很好。现在是 2024 年,当前 phpunit 版本是 11。 此 github 页面 https://github.com/symfony/symfony-docs/issues/20344 建议此功能现在也应该适用于 phpunit 版本 10 或更高版本,前提是您使用 phpunit-bridge 7.2
这是我的项目配置:
文档(https://symfony.com/doc/6.4/components/phpunit_bridge.html#clock-mocking)说我必须在我的 phpunit.xml 文件中激活侦听器,但 phpunit 10+ 不会不再知道这个选项了:
<listeners>
<listener class="\Symfony\Bridge\PhpUnit\SymfonyTestsListener"/>
</listeners>
所以我从 xml 文件中删除了监听器。
在我的测试中,代码如下:
class CompanyNameHelperTest extends TestCase
{
public function testGetCompanyNameByIdPast(): void
{
ClockMock::register(CompanyNameHelper::class);
ClockMock::withClockMock(true);
ClockMock::withClockMock(strtotime('2018-11-05 01:00:00'));
$myDate = (new DateTimeImmutable(date('Y-m-d H:m:s')));
$companyId = 1;
$this->assertEquals(
'ACME KG, Hamburg',
CompanyNameHelper::getCompanyNameById($companyId, $myDate)
);
ClockMock::withClockMock(false);
}
这会导致测试失败,因为未使用过去的日期,而是使用当前系统时间。
那么在 phpunit 10 及更高版本中使用/激活 ClockMock 的正确方法是什么?
所以我从 xml 文件中删除了监听器。
将其添加回来,PhpUnit 桥接器会按照 讨论 (dev.to) 来处理它:
Melroy van den Berg(2023 年 11 月 16 日)
我们应该怎么办..这个..这个在新的 xml.dist 文件之后就消失了,因为在 v10 中,listeners 似乎不再是有效的父元素了:
<listeners> <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" /> </listeners>
Guemer Houssem(24 年 1 月 18 日)
更新后的 symfony 桥可以解决这个问题