2012-02-25 6 views
9

「クラス」に関数があるかどうかをどのように確認できるか、私は疑問に思っていました。 assertClassHasAttributeは機能しません。これは、FunctionがAttributeではないためです。HowTo PHPUnit assertFunction

+2

をあなたはそれをテストしたいと思う理由: PHPUnitは、いずれかの関数が値気にいらを返しますが、あなたが使ってやりたいことができ、クラスが名前Xを持っていることを主張することができますか? – Gordon

+0

リファクタリングを行うときに便利です...デカップリングの責任などの理由でメソッドを別のクラスに移す必要があるときに、テストでクラスに含まれるメソッドを知っておくと便利です。 – HexaGridBrain

+0

私は主張したい依存関係が適切に嘲笑され/スタブされていることを確認し、公開APIを完全にカバーしている場合には、この必要はありません。 – Gordon

答えて

32

PHPUnitのIが提供するアサーションメソッドを作成したり、冗長なメッセージと下位レベルのアサーションのいずれかを使用するかがないのです。

$this->assertTrue(
    method_exists($myClass, 'myFunction'), 
    'Class does not have method myFunction' 
); 

assertTrue()は、あなたが得ることができるようになどの基本です。あなたのテストにブール値を返す組み込みのPHP関数を使用できるので、非常に柔軟性があります。したがって、テストが失敗すると、エラー/失敗メッセージはまったく役に立たない。 Failed asserting that <FALSE> is TRUEのようなものです。そのため、2番目のパラメータをassertTrue()に渡して、テストが失敗した理由を詳しく説明することが重要です。

7

単位と統合テストは、再定義しない振る舞いをテストするためのものです。 クラスの定義は何ですか。

したがって、PHPUnitはこのようなアサーションを提供しません。

/** 
* Assert that a class has a method 
* 
* @param string $class name of the class 
* @param string $method name of the searched method 
* @throws ReflectionException if $class don't exist 
* @throws PHPUnit_Framework_ExpectationFailedException if a method isn't found 
*/ 
function assertMethodExist($class, $method) { 
    $oReflectionClass = new ReflectionClass($class); 
    assertThat("method exist", true, $oReflectionClass->hasMethod($method)); 
} 
+0

素晴らしい。これは私の必要性に完璧に聞こえる。ありがとう@MounaCheikhna – shan