运行Magento 2 PHPUnit测试触发致命错误,求排查原因
解决Magento 2.2.1单元测试中的PHPUnit方法兼容错误
嘿,这个错误我之前帮不少开发者排查过,本质是PHPUnit版本与Magento 2.2.1不兼容导致的方法声明冲突,咱们一步步拆解原因和解决办法:
错误原因拆解
- Magento 2.2.1官方明确要求的PHPUnit版本是5.6.x系列,但你在
phpunit.xml.dist里引用了PHPUnit 6.2的schema(xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/6.2/phpunit.xsd"),这说明你本地装的是PHPUnit 6+版本。 - PHPUnit 6.x做了个重大的命名空间调整:把原来的
PHPUnit_Framework_Test类迁移到了PHPUnit\Framework\Test命名空间下。 - 而Magento 2.2.1自带的
ReplaceObjectManager监听器类,它的startTest方法声明还是基于旧的PHPUnit 5.x的PHPUnit_Framework_Test参数类型,和你当前装的PHPUnit 6.x的接口要求完全不匹配,所以直接触发了这个致命的兼容性错误。
另外,你的测试代码里还有个小坑:$objectManager->getObject('Magestore\HelloMagento\Model\HelloMessage')这里的命名空间和你的测试类命名空间TestStore\HelloMessage对不上,等下修复完版本问题,这个也得改,不然运行时会找不到类。
具体修复步骤
1. 降级PHPUnit到兼容版本
用Composer把PHPUnit降级到Magento 2.2.1支持的5.6.x版本:
composer require --dev phpunit/phpunit:~5.6.0
2. 修正phpunit.xml.dist的schema版本
把配置里的schema地址改成PHPUnit 5.6对应的版本:
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.6/phpunit.xsd"
3. 修正测试代码的命名空间错误
把对象实例化的代码改成和你实际类匹配的命名空间,比如如果你的HelloMessage类在TestStore\HelloMessage\Model下,应该写成:
$this->helloMessage = $objectManager->getObject('TestStore\HelloMessage\Model\HelloMessage');
或者更规范的用类名常量(避免拼写错误):
$this->helloMessage = $objectManager->getObject(\TestStore\HelloMessage\Model\HelloMessage::class);
4. 对齐Magento测试类命名规范
按照Magento的代码规范,单元测试类应该放在Test\Unit子命名空间下,比如把测试类的命名空间改成:
namespace TestStore\HelloMessage\Test\Unit\Model; use TestStore\HelloMessage\Model\HelloMessage; use PHPUnit_Framework_TestCase; class HelloMessageTest extends PHPUnit_Framework_TestCase { // ... 你的测试代码 }
验证修复效果
执行单元测试命令,确认错误消失:
phpunit -c dev/tests/unit/phpunit.xml.dist TestStore/HelloMessage/Test/Unit/Model/HelloMessageTest.php
内容的提问来源于stack exchange,提问作者rubyist
相关产品推荐
相关产品推荐

