在 phpunit 中使用未定义常量 LF

Use of undefined constant LF with phpunit

大家好,

我正在开发一个 TYPO3 扩展,我 运行 遇到了这种非常困难的情况 运行。我有一个 class 的单元测试,但是当我 运行 它时,我得到 Use of undefined constant LF - assumed 'LF' (this will throw an Error in a future version of PHP) 错误。

LF 字符是 *nix 系统中使用的换行符或换行符。 Windows 正在使用 CRLF 组合。

我在 Windows 10,上面有最新版本的 PHP 7.4 和 xdebug。我还有 WSL2 Ubuntu 和 PHP 7.4(没有 xdebug)。我使用 PHPStorm 作为我的 IDE。 PhpUnit 版本 9.5.

我在 运行 IDE(Windows 上下文)、CLI(Ubuntu 上下文)和 docker 容器中进行测试时收到此错误消息(也是 7.4,高山 Linux)。

我也在 IDE 中以调试模式 运行 将其设置为 IDE,我发现我的 UT 中的此语句引发了异常:

$pageRendererMock = $this->getMockBuilder(\TYPO3\CMS\Core\Page\PageRenderer::class)
      ->setMethods(['addJsInlineCode'])
      ->disableOriginalConstructor()
      ->getMock();

一旦调用 getMock() 就会抛出异常。所以我挖得更深。 我找到了 PhpUnit 的 MockClass::generate() 方法。它包含以下代码片段:

eval($this->classCode);

call_user_func(
    [
        $this->mockName,
        '__phpunit_initConfigurableMethods',
    ],
    ...$this->configurableMethods
);

__phpunit_initConfigurableMethods() 方法来自 \PHPUnit\Framework\MockObject\Api 特征。

通过进一步调试,我在 MockObject\Api::__phpunit_initConfigurableMethods() 特征的方法中找到了这一行:

if (isset(static::$__phpunit_configurableMethods)) {

我在这一行有一个断点。当我跨过它时,我得到了异常。

有趣的是代码中没有任何文字 LF

你遇到过这个问题吗?你是怎么解决的?

Use of undefined constant LF

PHP 常量 LFCRCRLF 由 TYPO3 bootstrap 在很早的时候定义:SystemEnvironmentBuilder->run() 调用defineBaseConstants()。它们是键入 LF 而不是 chr(10).

的“方便”常量

如果您的单元测试范围没有它们,则表明您的扩展测试设置不正确 bootstrap TYPO3。

处理此问题的典型设置是为引用 UnitTestsBootstrap.php 的 phpunit 设置一个 UnitTests.xml 文件。请参阅 typo3/testing-framework for good practice and copy those over to your setup, or if you have them already, make sure your phpunit call uses the .xml file (-c option). Extensions like b13/container 中的示例样板文件,这也是研究积极维护并支持多个核心版本的扩展的更复杂测试设置的好读物。