PHPUnit が OO の方法で物事を行うことにこだわるのはなぜですか?
質問
炎上する危険性も…コンテキストが暗黙的である場合、関数ではなくメソッドの呼び出しを強制することにはどのような利点がありますか。
PHP の構文がメソッド呼び出しにとって非常に醜いことを考えると、なぜ PHPUnit の作成者はその使用を強制したのでしょうか?
フレームワークがグローバルな「currentTestCase」オブジェクトを設定し、失敗したアサートをそのオブジェクトに透過的に関連付けた場合は、次のように書くことができます。
assertEquals("blah", $text);
同等ではあるが冗長なものとは対照的に:
$this->assertEquals("blah", $text);
このコンテキストで OO を使用すると、正確には何が得られますか。
教えてください。
解決
PHPUnitはxUnitの由来し、それはのxUnit のは、それをしない方法ですので。
なぜxUnitのは、それがそのように行うのですか?私はあなたが尋ねたうれしいです。ロバートが指摘するように、元の理由は、xUnitのは、Smalltalkのから来て、JavaでのJUnitによって広められたということです。彼らは選択の余地がなかったので、両方ともOOか無かの言語です。
これは、他の利点がないと言うことではありません。 OOテストは継承することができます。あなたはすべての親のテストを実行し、ちょうどあなたが変更した行動のための試験方法の一握りをオーバーライドすることができ、サブクラスをテストしたい場合、これが意味しています。これは、テストコードを複製することなく、あなたのサブクラスの優れたカバレッジを提供します。
PHPUnitのアサートメソッドを追加し、上書きするその簡単。ただ、サブクラスPHPUnit_Framework_TestCase
、独自のassert
メソッドを記述し、テストクラスは、あなたの新しいサブクラスを継承しています。また、デフォルトのsetup
とteardown
メソッドを書くことができます。
最後に、テストフレームワークの方法は、彼らがテストしているものと衝突するつもりはないことを保証します。テストフレームワークは、単なるテストにその機能をダンプし、setup
メソッドを持っていた何かをテストしたい場合は...よく、あなたはトラブルにしています。
私はあなたの痛みを聞いて、言いました。大きなテストフレームワークは、迷惑と面倒と脆いことができます。 PerlはxUnitのスタイルを使用していない、それは短いテスト関数名と手続きのスタイルを使用しています。例えばテスト::こちらを参照してください。それはあなたが示唆しただけでは何を舞台裏では、すべての機能が使用シングルトンテストインスタンスオブジェクトがあります。 OOの試験方法モジュールと呼ばれるテスト::クラスを持つハイブリッド手続きアサート機能もありますいます両方の長所を行います。
PHPの構文は、メソッドを呼び出すためのあまりの醜さであることを考慮すると、
私はあなたが->
を好きではないと思います。私はあなたがそれと一緒に暮らすことを学ぶお勧めします。 OO PHPがとても代替よりもはるかに進歩しています。
他のヒント
一つの良い理由は、メソッド名としてassertXXX
は衝突の名前付けの危険性が高いということです。
もう一つは、それが通常のオブジェクト指向言語を扱うのxUnitのの家族に由来していることです。これは、それが簡単に、例えばからあなたの「兄弟」に自分自身に関連することができますJavaとRubyの。
直接の答えではありませんが、PHPUnit 3.5 の時点では、次のように記述する必要はありません。 $this->
もう。PHPUnit 3.5 では、アサーション用の関数ライブラリが追加されました。これを含める必要があります。
require_once 'PHPUnit/Framework/Assert/Functions.php';
そうすれば、次のことができます
assertEquals('foo', $bar);
これについては Sebastian Bergmann のブログ投稿を参照してください。
クラスメソッドでテストケースを持つことは、PHPUnitのための作業を保存します。組み込みのインテリジェンスはPHPUnitの不足のため、純粋なテスト機能を見つけるか、扱うことができませんでした。のみを認識すること - シンプルなブール鎖 - -in>アサート*()メッセージを再処理ロジック(PHPUnitのためではなく、テストケース作成者)を保存します。これは、ビューのPHPUnitの/ SimpleTestのポイントからオーバーヘッド節約すべての構文塩です。
エラー/警告メッセージをキャプチャする例外やPHPSネイティブのassert()文を認識するための技術的な問題ではないでしょう。困難なAPIがよりenterpriseyに見えるので、それは行われていない。