Покрытие кода PHPUnit не распространяется на исполняемый метод - PullRequest
0 голосов
/ 23 марта 2019

Заранее прошу прощения за неправильное использование терминологии.

В настоящее время я экспериментирую с юнит-тестами, чтобы применить их к своей работе, но теперь я столкнулся с проблемой, если она вообще есть.

В тестируемом объекте выполняется метод, который не помечен как проверенный покрытием кода, хотя он выполняется и тест прошел успешно.

Я уже пробовал, может ли это быть из-за видимости методов (это защищено) или обратного вызова, переданного как параметр, который может вызвать эту «ошибку», изменяя видимость, а также параметры, но это не Кажется, причина не в этом.

Я использую следующую настройку

  • php-code-cover 6.1.4
  • PHP 7.1.10
  • Xdebug 2.6.1
  • PHPUnit 7.5.7

В следующем разделе кода вызывается метод extends и передается анонимная функция.

$this->values[$key] = $this->extend($key, function ($previous, ContainerInterface $container) use ($extensionFactory) {
    return call_user_func($extensionFactory, $container, $previous);
});

И это тест, в котором выполняются упомянутые методы

public function testContainerRegistersExtensions()
{
    /** mocking provider... */

    $this->assertEquals(['foo', 'bar'], (new Container([$provider]))->get('value'));
}


Как вы можете видеть на следующих рисунках фрагментах кода (моя репутация не позволяет использовать изображения), код помечен как покрытый (зеленый), но метод расширения является не (красный), хотя он выполняется во время теста:

$this->values[$key] = $this->extend($key, function ($previous, ContainerInterface $container) use ($extensionFactory) {
    return call_user_func($extensionFactory, $container, $previous);
});
protected function extend($id, $callable)
{  
    $factory = $this->values[$id];

    $extended = function (ContainerInterface $container) use ($callable, $factory) {
    # if the entry to extend is not a callable, we pass it as is
    $previous = is_callable($factory) ? $factory($container) : $factory;
        return $callable($previous, $container);
    };

    $this->values[$id] = $extended;

    return $this->values[$id];
}


Результат после проведения испытаний выглядит следующим образом
PHPUnit 7.5.7 by Sebastian Bergmann and contributors.


Time: 260 ms, Memory: 6.00 MB

OK (11 tests, 12 assertions)

Generating code coverage report in HTML format ... done

Теперь мне интересно, возможно, я что-то забыл или сделал что-то не так, или это может быть ошибка?

1 Ответ

0 голосов
/ 23 марта 2019

Похоже, я нашел решение.Документация PHPUnit, касающаяся аннотаций, гласит:

Аннотацию @covers можно использовать в тестовом коде, чтобы указать, какой метод (ы) метод тестирования хочет проверить

PHPUnit 7.5 Документация - Аннотации

Так что, если я укажу тег @covers в PHPDoc, соответствующий метод также будет покрыт (и только те части, которые фактически выполняются).Немного обидно, что это не происходит автоматически, но, возможно, это и было задумано.


Мой тест теперь выглядит следующим образом

/**
 * @covers \<Namespace>\Container::register
 * @covers \<Namespace>\Container::extend
 * @covers \<Namespace>\Container::get
 */
public function testContainerRegistersExtensions()
{
    /** mocking provider... */

    $this->assertEquals(['foo', 'bar'], (new Container([$provider]))->get('value'));
}
...