1

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

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

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

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

4

2 回答 2

2

如我所见,您可能没有涵盖方法中的catch声明validateParameters

尝试将您的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');

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

于 2012-12-04T09:41:18.737 回答
0

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

<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 的问题。

于 2012-12-16T18:47:41.243 回答