在 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 常量 LF
、CR
和 CRLF
在很早的时候由 TYPO3 引导程序定义:SystemEnvironmentBuilder->run()
调用 defineBaseConstants()
。它们是键入 LF
而不是 chr(10)
的“方便”常量。
如果您的单元测试范围没有它们,则表明您的扩展测试设置无法正确引导 TYPO3。
解决这个问题的典型设置是为 phpunit 提供一个 UnitTests.xml 文件,该文件引用 UnitTestsBootstrap.php。请参阅typo3/testing-framework 中的示例样板文件以获得良好实践并将它们复制到您的设置中,或者如果您已经拥有它们,请确保您的 phpunit 调用使用 .xml 文件(-c 选项)。像b13/container 这样的扩展也是一本很好的读物,可以研究更复杂的测试设置,以获取积极维护并支持多个核心版本的扩展。
【讨论】:
以上是关于在 phpunit 中使用未定义的常量 LF的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 5.2 的 PHPUnit 未找到自定义异常
使用 PDO SQL INSERT INTO 的 PHPunit 测试函数未定义数组键错误