2011-10-14 74 views

回答

1

有更好的方法來做到這一點。不要重載每個斷言*()方法,只能重載一個方法:runTest()。這是對每一個斷言,例外可以被捕獲:

abstract class AMyTestCase extends PHPUnit_Framework_TestCase 
{ 
    public function runTest() 
    { 
     try { 
      parent::runTest(); 
     } 
     catch (MyCustomException $Exc) { 
      // will continue tests 
     } 
     catch (Exception $Exc) { 
      if (false === strpos($Exc->getMessage(), 'element not found')) { 
       // rethrow: 
       throw $Exc; 
      } 
      // will also continue 
     } 
    } 
} 
2

我們在硒測試中做同樣的事情。您需要捕獲斷言失敗所引發的異常,唯一的方法是創建一個覆蓋斷言方法的自定義測試用例基類。您可以使用測試監聽器存儲故障消息並在最後通過測試。

我沒有在我面前的代碼,但它非常直截了當。例如,

abstract class DelayedFailureSeleniumTestCase extends PHPUnit_Extension_SeleniumTestCase 
{ 
    public function assertElementText($element, $text) { 
     try { 
      parent::assertElementText($element, $text); 
     } 
     catch (PHPUnit_Framework_AssertionFailedException $e) { 
      FailureTrackerListener::addAssertionFailure($e->getMessage()); 
     } 
    } 

    ... other assertion functions ... 
} 

class FailureTrackerListener implements PHPUnit_Framework_TestListener 
{ 
    private static $messages; 

    public function startTest() { 
     self::$messages = array(); 
    } 

    public static function addAssertionFailure($message) { 
     self::$messages[] = $message; 
    } 

    public function endTest() { 
     if (self::$messages) { 
      throw new PHPUnit_Framework_AssertionFailedException(
        implode("\n", self::$messages)); 
     } 
    } 
}