获得PHPUNit代码覆盖的简单'}其他{'线

时间:2017-01-16 08:49:17

标签: php phpunit code-coverage

我无法获得PHPUnit的代码覆盖率工具来标记此else语句,尽管它必须是或者无法涵盖以下行。在同一个类的其他地方,仅包含} else {的另一行被正确标记为已覆盖。

enter image description here

    if (is_string($externalId) && $externalId != '') {
        $sitesIds[] = $externalId;
    } else if ($regionName != null && $regionName != '') {
        $sitesIds = $this->sitesService->getSites($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');
    }

2 个答案:

答案 0 :(得分:1)

由于else实际上并没有做任何事情(它只能被视为标签),因此无法获得保障。

您的问题是您没有(is_string($externalId) && $externalId != '') false($regionName != null && $regionName != '')true(!is_array($sitesIds) || count($sitesIds) == 0)为{{1}的测试}}。 (您可能希望通过使用不完全等于false而不是等于!==来更具体:!=& ($externalId !== '')

如果你能让($regionName !== null && $regionName !== '')返回一个至少包含一个元素的数组,你的红线将被覆盖并变为绿色。

红线告诉你$sitesIds = $this->sitesService->getSites($regionName);之前的右括号}在技术上是可以到达的,但你没有覆盖它的测试。

答案 1 :(得分:0)

稍加修改的来源:

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]
        ];
    }
}

涵盖else行: enter image description here

PHP 5.6.15-1 + deb.sury.org~trusty + 1

PHPUnit 4.8.21