【问题标题】:PHPUnit Code Coverage of abstract class implementing an interface实现接口的抽象类的 PHPUnit 代码覆盖率
【发布时间】:2012-11-21 06:44:57
【问题描述】:

我目前正在为 Symfony2 开发比特币支付包。您可以在my github 上查看。它还没有(我希望)完全由测试驱动开发,但我尽量让它尽可能地被测试覆盖。

Bundle 包含实现CommandInterface 接口的AbstractCommand 类。因为它是一个抽象类,所以不需要实现接口的每一个方法。太好了。

接下来,我有AbstractCommandTest 测试用例。它测试validateParameters 方法是否有效。测试涵盖课程的每一行。但是......当我在我的 IDE(带有 PHP 插件的 IntelliJ Idea)上运行测试覆盖率分析时,它表明覆盖率是 93%。这很奇怪,因为没有线用红色标记(我已经更改了默认配色方案,所以我看得很清楚;))。

问题是:为什么? 是 PHPUnit 错误吗?或者可能是类模型构建问题?当我在 AbstractCommand 中有抽象方法(并且没有接口)时,它们也没有被覆盖。

【问题讨论】:

    标签: php interface phpunit abstract-class code-coverage


    【解决方案1】:

    如我所见,您可能没有涵盖 validateParameters 方法中的 catch 语句。

    尝试将您的 ParameterBug 参数设为模拟,以便在另一个测试中抛出 \InvalidArgumentException 异常。这应该涵盖您想要的内容(但为了使其成为可能,您必须将 validateName 方法更改为受保护):

    $parameterSetMock = $this->getMock('AppropraiteNamespace\ParameterSet', array('validateName'));
    $parameterSetMock->expects($this->any())
        ->method('validateName')
        ->will($this->throwException(new \InvalidArgumentException);
    

    还有一件事:

    您的测试中没有使用 try/catch 块。如果你使用:

     $this->setExpectedException('ExpectedException', 'Expected Message');
    

    在测试开始时,如果没有抛出预期的异常,测试将失败。

    【讨论】:

    • 我会尽快检查并写下结果。尽管他们 - 感谢您的回复!我尝试...捕获一个异常,因为我想检查 Exception 的参数是否有效。 setExpectedException 不允许这样的检查 (afaik)。
    • 我已经检查过了……不,catch 语句以及整个 AbstractCommand 类都被覆盖了。当我运行覆盖时,我的 IDE 中没有“红线”。
    • 我不知道你从前两天是否改变了一些东西,但我刚刚克隆了你的项目并运行了单元测试。我的报道显示 AbstractCommand 被 100% 覆盖。PHP 5.4.9、PHPUnit 3.7.1、XDebug 2.2.1
    • 我没有更改任何内容,因为我必须暂停这方面的工作一段时间。但是当我创建另一个捆绑包时,我遇到了类似的问题 - 下面的答案中的解决方案。感谢@Cyprian 的关注。
    【解决方案2】:

    在查看三叶草覆盖率文件时,我已经解决了这个问题。它显示:

    <file name="/srv/bundles-src/payment-bitcoin/Bitcoin/Client/Command/AbstractCommand.php">
        <class name="AbstractCommand" namespace="Wikp\Payment\BitcoinBundle\Bitcoin\Client\Command">
          <metrics methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="13" coveredstatements="13" elements="15" coveredelements="15"/>
        </class>
        <line num="0" type="stmt" count="0"/>
            <!-- coverage data for methods -->
        <line num="36" type="stmt" count="0"/>
        <metrics loc="35" ncloc="35" classes="1" methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="13" coveredstatements="13" elements="15" coveredelements="15"/>
      </file>
    

    查看 AbstractCommand 文件时,第 36 行是类定义后的空白行。删除它会导致覆盖率为 100%。我认为这是 IntelliJ/PHPStorm 的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多