获取简单'}else{'行的PHPUNit代码覆盖率

获取简单'}else{'行的PHPUNit代码覆盖率,php,phpunit,code-coverage,Php,Phpunit,Code Coverage,我无法让PHPUnit的代码覆盖率工具将此else语句标记为已覆盖,即使它必须被覆盖或无法覆盖下一行。在同一类的其他地方,仅包含}else{的另一行被正确标记为已覆盖 略加修改的来源: class A { const NO_MATCHING_REGION = 1; const BAD_REQUEST = 2; private $sitesService = ['a' => ['AA'], 'b'=>12]; public functi

我无法让PHPUnit的代码覆盖率工具将此else语句标记为已覆盖,即使它必须被覆盖或无法覆盖下一行。在同一类的其他地方,仅包含}else{的另一行被正确标记为已覆盖


略加修改的来源:

class A
{
    const NO_MATCHING_REGION = 1;
    const BAD_REQUEST        = 2;

    private $sitesService = ['a' => ['AA'], 'b'=>12];

    public function a($externalId, $regionName)
    {
        $sitesIds = [];
        if (is_string($externalId) && $externalId != '') {
            $sitesIds[] = $externalId;
        } else {
            if ($regionName != null && $regionName != '') {
                $sitesIds = $this->sitesService[$regionName];
                if (!is_array($sitesIds) || count($sitesIds) == 0) {
                    throw new \Exception(self::NO_MATCHING_REGION, '404');
                }
            } else {
                throw new \Exception(self::BAD_REQUEST.'. Should specify station or region', '400');
            }
        }
        return $sitesIds;
    }
}
测试

class ATest extends \PHPUnit_Framework_TestCase
{

    /**
     * @dataProvider data
     */
    public function testOk($id, $reg, $res)
    {
        $a = new A;
        $r = $a->a($id, $reg);
        $this->assertEquals($res, $r);
    }

    public function data()
    {
        return [
            ['a', 1, ['a']],
            [1,'a', ['AA']]
        ];
    }

    /**
     * @dataProvider error
     * @expectedException \Exception
     */
    public function testNotOK($id, $reg)
    {
        $a = new A;
        $a->a($id, $reg);
    }

    public function error()
    {
        return [
            [1,'b'],
            [1,null]
        ];
    }
}
包括以下行:

PHP5.6.15-1+deb.sury.org~trusty+1

PHPUnit 4.8.21

因为else实际上不起任何作用,所以它可以被认为只是一个标签,它不会被覆盖

您的问题是,您没有一个测试,其中is_string$externalId&&$externalId!=为false,$regionName!=null&&$regionName!=为true,并且!is_array$sitesIds | | count$sitesIds==0为false。您可能希望通过使用不完全等于!==而不是不等于!=:$externalId!==&$regionName!==null&$reg来更具体一些ionName!==

如果您可以获取$sitesIds=$this->sitesService->getSites$regionName;以返回至少包含一个元素的数组,则红线将被覆盖并变为绿色


红线告诉你,从技术上讲,在else之前的结束括号}是可以到达的,但是你没有覆盖它的测试。

我知道在测试中让一行变绿并不能改进代码,但我的OCD迫使我在可能的情况下覆盖最后一行:-移动else{分隔行会改变事情吗?@Furgas no.The}标记为uncovered,而else{为白色,这意味着它不打算被覆盖/测试。之前的测试只进行到投掷为止。
class ATest extends \PHPUnit_Framework_TestCase
{

    /**
     * @dataProvider data
     */
    public function testOk($id, $reg, $res)
    {
        $a = new A;
        $r = $a->a($id, $reg);
        $this->assertEquals($res, $r);
    }

    public function data()
    {
        return [
            ['a', 1, ['a']],
            [1,'a', ['AA']]
        ];
    }

    /**
     * @dataProvider error
     * @expectedException \Exception
     */
    public function testNotOK($id, $reg)
    {
        $a = new A;
        $a->a($id, $reg);
    }

    public function error()
    {
        return [
            [1,'b'],
            [1,null]
        ];
    }
}