PHPUnit和Guard子句,而不是100%的覆盖率

时间:2018-10-17 11:00:05

标签: php phpunit code-coverage guard-clause

我有这个守卫:

protected function validateRemove($key)
{
    if (!isset($this->collection[$key])) {
        throw new CategoryCollectionBadItemException();
    }
}

测试:

/**
 * @test
 * @expectedException InfluenceDecision\Domain\Exception\Category\CategoryCollectionBadItemException
 */
public function removeMethodMustThrowExceptionWithInvalidKey()
{
    $this->categoryCollection->add(
        new Category(
            null,
            'test category'
        )
    );

    $this->categoryCollection->remove(1);
}

CategoryCollection删除方法调用validateRemove方法

该测试工作正常,但是覆盖率不是100%,因为该测试无法访问validateRemove方法的最后一行:

enter image description here

什么是合适的解决方案?

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为您没有同时测试函数的两个分支,在您的测试案例中,当您抛出异常时该函数会中断,因此它在技术上还没有完成。您已经测试了功能的half,即使它是其中唯一的逻辑。

如果要100%覆盖,则需要在设置$this->collection[$key] 的地方创建测试。 在这种情况下,我建议将您的功能更改为类似

protected function validateRemove($key)
{
    if (!isset($this->collection[$key])) {
        throw new CategoryCollectionBadItemException();
    }

    return true;
}

,然后创建另一个测试,当您调用validateRemove()并且$this->collection[$key]被设置为 时,该测试为true。

我的例子就是我,因为我真的不知道如何使用这段代码!