断言抛出异常

PHPUnit 提供以下函数来监视抛出的异常,它们随 5.2.0 一起发布:

  • expectException($exception)
  • expectExceptionMessage($message)
  • expectExceptionCode($code)
  • expectExceptionMessageRegExp($messageRegExp)

这些用于监视要抛出的异常并检查该异常的属性。

让我们从分开的数学函数开始(仅为简单起见)。如果分母为零,则会引发异常。

function divide($numerator, $denominator) {
    
    if ($denominator !== 0) {
        return $numerator/$denominator;       
    } else {
        throw new \Exception("Cannot divide by zero", 100);
    }

}

现在为测试代码。

class DivideTest extends PHPUnit_Framework_TestCase
{

    public function test_divide() {

        $this->assertSame(2,divide(4,2));

        $this->expectException("Exception");
        $this->expectExceptionCode(100);
        $this->expectExceptionMessage("Cannot divide by zero");
        $this->expectExceptionMessageRegExp('/divide by zero$/');

        // the expectations have been set up, now run the code
        // that should throw the exception
        divide(4,0);

        // The following code will not execute, the method has exited
        $this->assertSame(0,1);

    }

}

test_divide() 函数首先声明函数正确地将 4 除以 2 并回答 2.该断言将通过。

接下来,设置对即将发生的异常的期望。请注意,它们是在抛出异常的代码之前设置的。所有四个断言都是出于演示目的而展示的,但这通常不是必需的。

然后 divide(4,0) 将抛出预期的异常,并且所有期望的*函数都将通过。

但请注意,代码 $this->assertSame(0,1) 将不会被执行,事实上它是一个失败并不重要,因为它不会运行。除以零的异常导致测试方法退出。这可能是调试时的混乱源