2009-03-04 21 views
7

如果我是正確的,SimpleTest將允許你聲明一個PHP錯誤被拋出。但是,根據文檔,我無法弄清楚如何使用它。我想斷言,我通過了我的構造函數的對象是MyOtherObjectSimpleTest:如何聲明PHP錯誤被拋出?

class Object { 
    public function __construct(MyOtherObject $object) { 
     //do something with $object 
    } 
} 

//...and in my test I have... 
public function testConstruct_ExpectsAnInstanceOfMyOtherObject() { 
    $notAnObject = 'foobar'; 
    $object = new Object($notAnObject); 
    $this->expectError($object); 
} 

我要去哪裏錯了一個實例?

回答

13

類型提示拋出E_RECOVERABLE_ERROR,自PHP 5.2以來,它可以被SimpleTest捕獲。以下內容將捕獲包含文本「必須是實例」的任何錯誤。 PatternExpectation的構造函數需要一個perl正則表達式。

public function testConstruct_ExpectsAnInstanceOfMyOtherObject() { 
    $notAnObject = 'foobar'; 
    $this->expectError(new PatternExpectation("/must be an instance of/i")); 
    $object = new Object($notAnObject); 
} 
+0

我還沒有驗證過,所以我只是假設這是真的。感謝您的回答! – Andrew 2009-03-20 03:53:35

2

PHP既有錯誤也有例外,它們的工作方式略有不同。將錯誤的類型傳遞給類型化的函數會引發異常。你必須在你的測試案例中捕捉到這一點。例如:

public function testConstruct_ExpectsAnInstanceOfMyOtherObject() { 
    $notAnObject = 'foobar'; 
    try { 
    $object = new Object($notAnObject); 
    $this->fail("Expected exception"); 
    } catch (Exception $ex) { 
    $this->pass(); 
    } 
} 

或者乾脆:

public function testConstruct_ExpectsAnInstanceOfMyOtherObject() { 
    $this->expectException(); 
    $notAnObject = 'foobar'; 
    $object = new Object($notAnObject); 
} 

但是請注意,這將在異常發生的行之後停止測試。

+1

我沒有給你倒票。但是,我想我應該提到爲什麼我認爲有人會低估它:這個答案與'例外'有關,而不是'錯誤'。當一個類型提示拾取錯誤的類型時,它會拋出一個'錯誤'而不是'異常'。 – 2012-04-09 07:18:45

1

在發生錯誤之前,您必須預期錯誤,然後SimpleTest會吞下它並計算一遍,如果測試到達最後並且沒有錯誤,那麼它將失敗。 (expectError和expectException分別對PHP(非致命)錯誤和Exceptions有同樣的作用)。

2

原來,SimpleTest實際上並不支持這一點。您無法在SimpleTest中發現致命的PHP錯誤。類型暗示很好,除非你不能測試它。類型提示會引發致命的PHP錯誤。

+2

從PHP版本5.2開始,SimpleTest可以捕獲類型提示錯誤。看到我的答案。 – 2009-03-18 19:39:08