有时,IntelliJ IDEA在运行,调试或显示PHPUnit测试的代码覆盖率方面存在问题.当它生成的类与您拥有的PHPUnit版本不兼容时,可能会发生这种情况.
就我而言,它是IntelliJ IDEA 12.1.6而不是PHPUnit 4.0.14,它始终因此消息而失败:
/usr/bin/php /tmp/ide-phpunit.php --configuration /home/username/Documents/stuff/phpunit.xml.dist Testing started at 5:32 PM ... PHP Fatal error: Class IDE_PHPUnit_Framework_TestListener contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (PHPUnit_Framework_TestListener::addRiskyTest) in /tmp/ide-phpunit.php on line 496 PHP Stack trace: PHP 1. {main}() /tmp/ide-phpunit.php:0 Process finished with exit code 255
它生成的代码/tmp/ide-phpunit.php
不包含PHPUnit 4.x所需的新方法.
事情我已经试过了不工作:
手动修复文件并将其标记为只读会导致IntelliJ停止并抱怨它无法替换文件.
设置"run-before"命令以自动修补文件是不够的,因为它似乎不适用于调试或代码覆盖,只能定期运行.
Darien.. 18
我发现的最佳解决方案是通过手动修复来修补IntelliJ安装.这些说明假设Linux路径,但在Windows上应该可以使用相同的基本过程.
首先,php.jar
在IntelliJ安装中找到该文件.JAR文件是一种ZIP文件,您可以使用相同的工具打开(并修改)它们.在我的系统上,它出现在:
/home/username/.IntelliJIdea12/config/plugins/php/lib/php.jar
备份php.jar
,因为我们要编辑它.
使用流行的ZIP文件工具(如7-Zip)打开php.jar
,找到里面的compresesd文件:
scripts/phpunit.php
将此文件解压缩到可以编辑它的临时位置.
在文件中,我们需要找到类IDE_PHPUnit_Framework_TestListener
,在我的情况下是在线303
.在该类中,我们需要添加一个新方法:
public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time){}
完成后保存文件.
现在scripts/phpunit.php
用新版本覆盖JAR内部.根据您的ZIP工具,这可能就像双击文件以打开它,保存更改并单击确认提示一样简单,但这取决于您使用的是什么.
现在你应该完成!使用PHPUnit运行,调试或生成代码覆盖率数据应该只需单击按钮即可.
请注意,如果您更新PHP插件,它可能会覆盖修复程序,您需要再次重新应用它.
我发现的最佳解决方案是通过手动修复来修补IntelliJ安装.这些说明假设Linux路径,但在Windows上应该可以使用相同的基本过程.
首先,php.jar
在IntelliJ安装中找到该文件.JAR文件是一种ZIP文件,您可以使用相同的工具打开(并修改)它们.在我的系统上,它出现在:
/home/username/.IntelliJIdea12/config/plugins/php/lib/php.jar
备份php.jar
,因为我们要编辑它.
使用流行的ZIP文件工具(如7-Zip)打开php.jar
,找到里面的compresesd文件:
scripts/phpunit.php
将此文件解压缩到可以编辑它的临时位置.
在文件中,我们需要找到类IDE_PHPUnit_Framework_TestListener
,在我的情况下是在线303
.在该类中,我们需要添加一个新方法:
public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time){}
完成后保存文件.
现在scripts/phpunit.php
用新版本覆盖JAR内部.根据您的ZIP工具,这可能就像双击文件以打开它,保存更改并单击确认提示一样简单,但这取决于您使用的是什么.
现在你应该完成!使用PHPUnit运行,调试或生成代码覆盖率数据应该只需单击按钮即可.
请注意,如果您更新PHP插件,它可能会覆盖修复程序,您需要再次重新应用它.