我无法获得PHPUnit的代码覆盖率工具来标记此else
语句,尽管它必须是或者无法涵盖以下行。在同一个类的其他地方,仅包含} else {
的另一行被正确标记为已覆盖。
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');
}
答案 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]
];
}
}
PHP 5.6.15-1 + deb.sury.org~trusty + 1
PHPUnit 4.8.21