我目前正在为Symfony2开发比特币支付套餐。您可以在my github上查看。它(但是,我希望)完全是测试驱动开发的,但我尽量让它尽可能地进行测试。
Bundle包含实现AbstractCommand
接口的CommandInterface
类。因为它是一个抽象类,所以它不需要实现每个接口的方法。大。
接下来,我有AbstractCommandTest
测试用例。它测试validateParameters
方法效果很好。测试涵盖了课程的每一行。但是......当我在我的IDE(使用PHP插件的IntelliJ Idea)上运行测试覆盖率分析时,它显示覆盖率为93%。这是非常奇怪的,因为没有线标有红色(我已经改变了默认配色方案,所以我看得很清楚;))。
问题是:为什么? 是PHPUnit的bug吗?或者也许是阶级模型建设问题?当我在AbstractCommand中使用抽象方法(并且没有接口)时,它们也没有被覆盖。
答案 0 :(得分:2)
正如我所看到的,您可能没有涵盖catch
方法中的validateParameters
语句。
尝试将ParameterBug
参数设为mock,以便在另一个测试中抛出\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');
在测试开始时,如果不抛出预期的异常,测试将失败。
答案 1 :(得分: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的问题。