如何使用 phpunit 10+ 正确配置 ClockMock?

问题描述 投票:0回答:1

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

这是我的项目配置:

  • 交响乐:6.4
  • php:8.2
  • phpunit/phpunit:41.5.10
  • symfony/phpunit-bridge:7.2.0

文档(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 的正确方法是什么?

php symfony symfony6 php-8.2 phpunit-10
1个回答
0
投票

所以我从 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 桥可以解决这个问题

© www.soinside.com 2019 - 2024. All rights reserved.