在 phpunit 中使用未定义的常量 LF

Posted

技术标签:

【中文标题】在 phpunit 中使用未定义的常量 LF【英文标题】:Use of undefined constant LF with phpunit 【发布时间】:2022-01-03 19:10:10 【问题描述】:

大家好,

我正在开发一个 TYPO3 扩展,我遇到了这种非常奇怪的情况。我有一个类的单元测试,但是当我运行它时,我得到了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、alpine Linux)中运行测试时收到此错误消息。

我也在 IDE 中以调试模式运行它,我发现在我的 UT 中的这条语句上抛出了异常:

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

只要调用getMock(),就会抛出异常。所以我挖得更深。 我得到了 PhpUnit 的 MockClass::generate() 方法。它包含以下 sn-p 代码:

eval($this->classCode);

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

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

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

if (isset(static::$__phpunit_configurableMethods)) 

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

有趣的是,代码中的任何地方都没有文字 LF

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

【问题讨论】:

我忘了提到我在 repo 中的所有文件都有 Linux 风格的行尾 (LF) 但我试图将它们转换为 Windows 格式 (CRLF) 但它没有多大帮助。 【参考方案1】:

未定义常量LF的使用

PHP 常量 LFCRCRLF 在很早的时候由 TYPO3 引导程序定义:SystemEnvironmentBuilder->run() 调用 defineBaseConstants()。它们是键入 LF 而不是 chr(10) 的“方便”常量。

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

解决这个问题的典型设置是为 phpunit 提供一个 UnitTests.xml 文件,该文件引用 UnitTestsBootstrap.php。请参阅typo3/testing-framework 中的示例样板文件以获得良好实践并将它们复制到您的设置中,或者如果您已经拥有它们,请确保您的 phpunit 调用使用 .xml 文件(-c 选项)。像b13/container 这样的扩展也是一本很好的读物,可以研究更复杂的测试设置,以获取积极维护并支持多个核心版本的扩展。

【讨论】:

以上是关于在 phpunit 中使用未定义的常量 LF的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5 Phpunit 未定义方法

Phpunit给出未定义的变量项目错误

使用 Laravel 5.2 的 PHPUnit 未找到自定义异常

使用 PDO SQL INSERT INTO 的 PHPunit 测试函数未定义数组键错误

PHPUnit 错误:调用未定义的方法 Tests\Unit\ExampleTest::visit()

当我使用标志覆盖率运行 Phpunit 时,出现错误:未定义的变量工厂