2009-03-04 6 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

PHPのバージョン5.2以降SimpleTestで捕捉可能なヒンティングタイプのE_RECOVERABLE_ERRORです。以下は、 "must be an instance of"のテキストを含むエラーを検出します。 PatternExpectationのコンストラクタはperl正規表現を取ります。

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

私はこれを確認していないので、私はこれが真であると仮定しています。ご回答有難うございます! – Andrew

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

私はあなたに投票を下しませんでした。しかし、なぜ私は誰かがそれを落としてしまったと思うと言わなければならないと思った。この答えは「エラー」ではなく「例外」に関する。型ヒントが間違った型を取り除くと、 'Error'がスローされ、 'Exception'はスローされません。 –

1

エラーが発生する前にエラーが発生していることを前提にして、SimpleTestはそれを呑み込んでパスをカウントします。テストが終了し、エラーがなければ失敗します。 (PHP(致命的でない)エラーと例外の場合と同じように動作するexpectErrorとexpectExceptionがあります)。

2

SimpleTestはこれを実際にサポートしていません。 SimpleTestで致命的なPHPエラーを検出することはできません。あなたがそれをテストすることができない限り、タイプのヒントは素晴らしいです。型ヒントは致命的なPHPエラーをスローします。

+2

PHPバージョン5.2以降、SimpleTestはタイプヒントエラーを取得できます。私の答えを見てください。 –

関連する問題