Тестирование исключений в PHPUnit

Для проверки бросил ли тестируемый код необходимое исключение (exception) в PHPUnit есть аннотация @expectedException.

Приведём пример.
Тестируемый код:

<?php
// src/ExampleProject/Controller.php
namespace ExampleProject;

class Controller
{
    /**
     * @param array $data
     * @throws \Exception
     */
    public function indexAction(array $data)
    {
        if (!isset($data['var'])) {
            throw new \Exception('Error: var param is not defined', 101);
        }
    }
}
            

 

Код теста:

<?php
// tests/ExampleProject/ControllerTest.php
namespace Tests\ExampleProject;

use PHPUnit\Framework\TestCase;
use ExampleProject\Controller;

class ControllerTest extends TestCase
{
    /**
     * @expectedException \Exception
     */
    public function testIndexAction()
    {
        $controller = new Controller();
        $controller->indexAction(['test']);
    }
}
            

 

Также можно проверить сообщение и код исключения с помощью аннотаций @expectedExceptionMessage и @expectedExceptionCode:

<?php
// tests/ExampleProject/ControllerTest.php
namespace Tests\ExampleProject;

use PHPUnit\Framework\TestCase;
use ExampleProject\Controller;

class ControllerTest extends TestCase
{
    /**
     * @expectedException \Exception
     * @expectedExceptionCode 101
     * @expectedExceptionMessage Error: var param is not defined
     */
    public function testIndexAction()
    {
        $controller = new Controller();
        $controller->indexAction(['test']);
    }
}