斷言丟擲異常

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) 將不會被執行,事實上它是一個失敗並不重要,因為它不會執行。除以零的異常導致測試方法退出。這可能是除錯時的混亂源