Как можно создать собственный assert в PHPUnit, который будет останавливать выполнение теста при его срабатывании?

Я создаю свой собственный `assert`, который включает стандартный `assert` внутри. При возникновении ошибки выполнение останавливается на стандартном `assert`, и отображается код, в котором он был вызван. Как можно сделать так, чтобы выполнение также останавливалось с подсветкой на месте вызова моего собственного `assert`-a?
  • 5 января 2025 г. 12:33
Ответы на вопрос 1
Чтобы создать свой собственный метод `assert` в PHPUnit, который будет действиями ваше тестирование и специально выделять место вызова, вы можете наследоваться от класса `Assert` в PHPUnit и переопределить нужные методы. Однако проще всего будет создать собственный метод в вашем тестовом классе и использовать встроенные возможности `PHPUnit`.

Вот пример создания собственного `assert`, который вызывает стандартный `assert`, но с дополнительной информации о местоположении вызова:

```php
use PHPUnit\Framework\Assert;

class MyTestCase extends PHPUnit\Framework\TestCase
{
    protected function assertCustom($condition, $message = '')
    {
        if (!$condition) {
            $trace = debug_backtrace();
            $caller = $trace[1]; // это вызов метода assertCustom
            $file = $caller['file'];
            $line = $caller['line'];

            throw new \PHPUnit\Framework\ExpectationFailedException(
                "Assertion failed at $file:$line\n" . $message
            );
        }
    }
}
```

В данном коде:
1. Вы создаете метод `assertCustom`, который принимает условие и сообщение.
2. Используется `debug_backtrace`, чтобы получить информацию о месте вызова. 
3. Если условие оказывается ложным, бросается исключение `ExpectationFailedException` с указанием файла и строки, где был вызван ваш `assertCustom`.

Теперь вы можете использовать `assertCustom` в ваших тестах:

```php
class MyTests extends MyTestCase
{
    public function testExample()
    {
        $value = 1;
        $this->assertCustom($value === 2, 'Value should be 2');
    }
}
```

При выполнении этого теста, если условие не выполняется, будет отображено сообщение об ошибке с указанием местоположения вызова `assertCustom`, что поможет вам быстро находить ошибки.
Похожие вопросы