2009-06-01 12 views
1

flamedの危険性...関数ではなくメソッドへの呼び出しを強制することは、コンテキストが暗黙的であるコンテキスト内でどのような利点がありますか。なぜPHPUnitはオブジェクト指向のやり方を主張していますか?

PHPの構文が、メソッド呼び出しのために非常に醜いことを考慮すると、なぜPHPUnitの作成者はその使用法を強制していますか?

フレームワークは、グローバルな「currentTestCase」オブジェクトを設定していたし、その後、透過的に失敗に関連するが、我々は書くことができ、そのオブジェクトと主張する場合:

assertEquals("blah", $text); 

を同等に反対、しかし、冗長よう:

$this->assertEquals("blah", $text); 

この文脈でOOを使って正確に何を得るのですか?

私に教えてください。

+2

あなたはグローバルの使用を提唱していますか? – Robert

+0

はい、私は、しかし、厳密な文脈であると思います。さて、あなたは私に汚れを感じさせました。 –

+0

あなたはあなたが今与えられている答えを見直し、最も有用なものを受け入れるか、あなたの質問を解決して答えがあなたのために解決しない理由を書き留めてください。ありがとう。 – Gordon

答えて

6

PHPUnitはxUnitから派生しているので、それはどのようにxUnitを実行するのですか。

なぜxUnitはそうしていますか?私はあなたに尋ねられてうれしいです。ロバートが指摘した元の理由は、xUnitはSmalltalkから来ており、JavaのJUnitによって広く普及したということです。どちらもOO-or-nothing言語なので選択肢はありません。

これは他の利点がないと言うわけではありません。 OOテストは継承できます。つまり、サブクラスをテストする場合は、すべての親テストを実行して、変更したビヘイビアのテストメソッドの一部をオーバーライドできます。これにより、テストコードを複製することなく、優れたサブクラスのカバレッジが得られます。

PHPUnitで簡単にアサーションメソッドを追加したりオーバーライドしたりできます。サブクラスPHPUnit_Framework_TestCaseをサブクラス化し、独自のassertメソッドを記述し、テストクラスに新しいサブクラスを継承させます。また、デフォルトのsetupteardownメソッドを記述することもできます。

最後に、テストフレームワークのメソッドがテストしているものと衝突しないことを保証します。テストフレームワークがその機能をテストにダンプしただけで、setupメソッドを持っていたものをテストしたいのであれば、うまくいきません。

私はあなたの痛みを聞いています。大きなテストフレームワークは、面倒で面倒で脆いことがあります。 PerlはxUnitスタイルを使用せず、短いテスト関数名を持つ手続き型スタイルを使用します。例については、Test::Moreを参照してください。あなたが示唆したことだけで、すべての関数が使用するシングルトンテストインスタンスオブジェクトがあります。また、OOテストメソッドモジュールであるTest::Classと呼ばれるハイブリッド手続き型アサート関数もあり、両方の世界でベストを尽くしています。PHPの構文が呼び出すメソッド

私はあなたが->を好きではないと思うのためのあまりの醜さであることを考慮

。私はあなたがそれで生きることを学ぶことを提案する。 OO PHPは、これに比べてずっと良いです。

+0

十分に公正で、私はあなたの既存のTestCasesを拡張する考えに同意しますが、アサーションメソッドをオーバーライドするのは悪いフォームのようです。参考までに、私はそれが不必要な時には、違法ではない。テストに感謝します::その他のリンク+1 –

+0

あなたのニーズに合わせて独自のアサーションを追加するだけでなく、オーバーライドするだけです。非常に便利です。たとえば、DrupalのSimpleTest分岐には、2つの配列が等しいと主張する方法がないため、assertArrayEq()を記述しました。そのassertEquals()は失敗診断が不足しているというだけではないと言っていますが、デバッグ用の値を知る必要があるので、値を表示してデバッグを高速化する独自のassertEq()を書きました。 Perlプログラマーは10年前にOOを気にしていましたので、PHPコミュニティがまもなく登場すると思います。 :P – Schwern

3

メソッド名としてassertXXXは、命名の衝突の危険性が高いという理由があります。

xUnitファミリから派生したものです。これは通常、オブジェクト指向言語Smalltalkを最初に扱います。これにより、あなたの「兄弟」との関連付けが簡単になります。 JavaとRuby。

0

クラスメソッドでテストケースを持つと、PHPUnitの作業が節約されます。組み込みのインテリジェンスがないため、PHPUnitは純粋なテスト関数を見つけたり処理したりすることができませんでした。単純なブーリアンチェーンで - > assert *()メッセージを認識するだけで、処理ロジック(PHPUnitではテストケースの作成者ではありません)が再度保存されます。それはPHPUnit/SimpleTestの観点からオーバーヘッドを節約する構文上の塩です。

エラー/警告メッセージ、例外をキャプチャしたり、PHPのネイティブassert()ステートメントを認識することは、技術的な問題ではありません。難しいAPIがもっとエンタープライズに見えるので、これは行われません。

2

直接答えはありませんが、PHPUnit 3.5以降は、$this->を書く必要はありません。 PHPUnitの3.5は、あなたが

require_once 'PHPUnit/Framework/Assert/Functions.php'; 

を含める必要がアサーションのための関数ライブラリを追加した後、あなたはそれ

について

assertEquals('foo', $bar); 

参照セバスチャン・バーグマンのブログ投稿を行うことができます

+0

これは私の質問に対する答えですが、私はそれを聞いた時ではありませんでした。私はそれを受け入れるつもりですが、将来誰かがこのポインタを解決しようと考えているので、これを利用することができます。 –

関連する問題