抽象类的PHPUnit代码覆盖率为0%,即使它经过了明确的测试

时间:2015-01-19 15:58:18

标签: php unit-testing phpunit tdd abstract-class

在这里编写PHP包,使用PhpUnit 4 +编写TDD。

为我的所有常规课程编写测试工作正常,报告中涵盖了它们。但是,当我测试一个抽象类的模拟时,即使测试明确地贯穿该方法(如果我没有实现它也会失败,或者我在那里放置一些断点),代码覆盖率为0%。

我已经将违规代码提取到了回购here,如果你想给它一个旋转。您需要做的就是克隆,编写器安装,并运行phpunit,它们都已配置完毕。

这是在一个Vagrant盒子上运行,因此是一个与我的PHP版本或可用扩展没有任何关系的隔离环境,并且other people也在其安装上进行了测试,生成了相同的结果

正在测试的抽象类是here,而其测试可以看到here

非常感谢任何关于我在这里做错的提示。

编辑:

好的,作为补充说明,请参阅下面接受的答案评论,以及Jordi的推文here。基本上,出于性能原因,Composer的自动加载器只是遵循它所在的文件系统的情况,因此最好是在文件夹中使用与类名称相同的情况。如果您的命名空间是大写的,那么您的文件夹也应该是。这仍然留下了一个问题,为什么它实际上设法读取和运行类的方法,但没有将其标记为涵盖,所以如果您对此有任何见解,请发表评论或一个更完整的答案,我会重新接受那个。

编辑2:

来自IRC的dstockto的其他合理解释:

  

我认为问题是因为当phpunit收集代码覆盖率信息时,它就在PHP数组中。密钥区分大小写,因此即使您已经涵盖了这一点,覆盖范围也是针对不同的文件,PHPunit与已加载的文件不匹配

1 个答案:

答案 0 :(得分:2)

我已经开始工作了,而且覆盖率是100%。 :-)问题是:

$ phpunit --verbose --bootstrap vendor/autoload.php
PHPUnit 4.4.2 by Sebastian Bergmann.

Configuration read from /home/ren/tmp/phpunit-oddity/phpunit.xml.dist

E

Time: 151 ms, Memory: 3.25Mb

There was 1 error:

1) Swader\Diffbot\Test\ApiTest::testSetTimeout
PHPUnit_Framework_MockObject_RuntimeException: Class "Swader\Diffbot\Abstracts\Api" does not exist.

调试表明,真正的问题是主机上不区分大小写的文件系统。 Vagrant运行Linux。目录abstractsAbstracts不同。 Linux上的PhpUnit无法找到它正在寻找的类。