2017-01-16 8 views
0

Я не могу получить инструмент CoverUpage для PHPUnit, чтобы пометить этот оператор else как охватываемый, даже если он должен быть, или следующая строка не может быть покрыта. В другом месте этого же класса другая строка, содержащая только } else {, правильно помечена как закрытая.Получение кода PHPUNit для простого '} else {' line

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'); 
    } 
+1

Я знаю, что получение одной строки в зеленой зоне теста не улучшает код, но мой OCD заставляет меня получить эту последнюю строку, если я могу :-) – Craig

+0

Переводит 'else {' для разделения строки меняют вещи? – Furgas

+0

@Furgas No..} Помечено как непокрытое, а 'else {' is white, то есть оно не предназначено для покрытия/тестирования. – Craig

ответ

1

Поскольку else на самом деле ничего не делать (это можно считать просто ярлык) он выиграл Не закрывайся.

Ваша проблема заключается в том, что вы не тест, где (is_string($externalId) && $externalId != '') является false, ($regionName != null && $regionName != '') является true и (!is_array($sitesIds) || count($sitesIds) == 0) является false. (Вы могли бы хотеть быть более конкретным, используя не в точности равна !== вместо не равна !=: ($externalId !== '') & ($regionName !== null && $regionName !== ''))

Если вы можете получить $sitesIds = $this->sitesService->getSites($regionName); возвращать массив, по меньшей мере, один элемент, ваша красная линия будет покрыты и становятся зелеными.

Красная линия сообщает вам, что закрывающая скоба } до else технически достижима, но у вас нет тестов, которые ее покрывают.

+0

Это сделало это. Предыдущий тест прошел только до «броска». – Craig

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 ~ испытанный + 1

PHPUnit 4.8.21