测试异常

假设你要测试抛出异常的方法

class Car
{
    /**
     * @throws \Exception
     */
    public function drive()
    {
        throw new \Exception('Useful message', 1);
    }
}

你可以通过将方法调用封装到 try / catch 块中并对 execption 对象的属性进行断言来实现,但更方便的是你可以使用异常断言方法。从 PHPUnit 5.2 开始, 你可以使用 expectX() 方法来断言异常类型,消息和代码

class DriveTest extends PHPUnit_Framework_TestCase
{
    public function testDrive()
    {
        // prepare
        $car = new \Car();
        $expectedClass = \Exception::class;
        $expectedMessage = 'Useful message';
        $expectedCode = 1;

        // test
        $this->expectException($expectedClass);
        $this->expectMessage($expectedMessage);
        $this->expectCode($expectedCode);

        // invoke
        $car->drive();
    }
}

如果你使用的是早期版本的 PHPUnit,则可以使用方法 setExpectedException 代替 expectX() 方法,但请记住它已弃用,将在版本 6 中删除。

class DriveTest extends PHPUnit_Framework_TestCase
{
    public function testDrive()
    {
        // prepare
        $car = new \Car();
        $expectedClass = \Exception::class;
        $expectedMessage = 'Useful message';
        $expectedCode = 1;

        // test
        $this->setExpectedException($expectedClass, $expectedMessage, $expectedCode);

        // invoke
        $car->drive();
    }
}