Некоторое время назад я начал писать тесты в PHPUnit (v.9). Это здорово и потрясающе, но:

Как правильно покрыть условные предложения?

Приведу несколько примеров, когда результат правильный и ожидаемый, а где я вижу проблемы. Вот:

Обратите внимание, что приведенный ниже код - это только образец.

Я знаю, что когда я передаю true оператору if, у меня не будет возможности перейти в другую ветку кода. Это только максимально простой пример.

Ситуация, когда проблемы не существует:

if (true) {
    return 'true';//here is covered
}
return 'false';//here is not covered    

И это нормально, но ниже:

return (true) ? 'true' : 'false';

Вся строка рассматривается как закрытая, но очевидно, что false никогда не будет возвращено.

Так. Что я делаю плохо?

Единственное решение - не использовать тернарный оператор? Его очень короткий синтаксис, но он подвержен ошибкам из-за отсутствия (реальной / ложной) информации о покрытии. :(

1
Marek G. 20 Май 2021 в 11:54

1 ответ

Лучший ответ

Представлением по умолчанию в модуле PHP действительно является покрытие строки , и, следовательно, как вы указываете, невозможно различить обе ветви в однострочном троичном случае.

Однако в последнее время PHPUnit также имеет покрытие ветвей и путей. Вывод модуля PHP

Он показывает это в выходных данных слева от «Lines». Чтобы увидеть, какие ветки отсутствуют, вы можете навести указатель мыши на желтую строку в исходном представлении, и она сообщит вам, что (в моем примере) пройдены только 3 из 4 возможных путей.

branches view

Автор этой функции также написал подробное объяснение в своем блоге.

4
Derick 20 Май 2021 в 09:15