获取简单'}else{'行的PHPUNit代码覆盖率
我无法让PHPUnit的代码覆盖率工具将此else语句标记为已覆盖,即使它必须被覆盖或无法覆盖下一行。在同一类的其他地方,仅包含}else{的另一行被正确标记为已覆盖获取简单'}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
略加修改的来源:
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]
];
}
}