3

Zend Framework と PHPUnit は初めてです。レガシー アプリケーションを MVC アーキテクチャに変換し、単体テストを作成しようとしています。私は単体テストの概念にある程度精通していますが、一般的にスタブとモックにこだわっています。たとえば、次のことを検討してください

テストしようとしているコントローラー アクションで、メンバー ID を渡します。次に、ID を使用してメンバー オブジェクトを初期化します。次に、メンバー オブジェクトに関連付けられたいくつかのメソッドを呼び出し、戻り値をビュー オブジェクトに割り当てます。

class A extends Zend_Controller_Action {
    public function viewAction() {
        $member = new Member($this->getRequest()-> getParam('id'));

        //perform various calls on the member object 

        $gender = $member->getGender();
        ...

        //assign the return values to the view object

        $this->view->assign('gender',$gender);   
        ...

     }
}

メソッドの戻り値をカスタマイズできるように、テストで $member 変数をモックするにはどうすればよいですか?

ここでの私の理解が間違っている場合は、いくつかのガイダンスをいただければ幸いです。

ありがとうございました!

4

2 に答える 2

6

私の理解が正しければ、あなたはこのアクションのテストを書いています。その場合、メソッド内で新しいインスタンスが作成されるため、$member をモックすることはできません。newそのため、オブジェクト グラフ (DI) でできるだけ多くのステートメントをフロートさせようとしています。

通常、コントローラーをテストするための特別な PHPunit テストケースZend_Test_PHPUnitがあります。

しかし、実際のところ、ZF コントローラーを正しくテストすることは非常に困難であり、不可能ですらあります (つまり、完全な分離を意味します)。アプリの残りの部分、一般的なライブラリなどをテストすることをお勧めします。

言い換えれば、ZF1 ロジックでは、コントローラは (ブートストラップの後の) 中央の配線場所であり、多くのnewステートメントが伝統的に使用されています。注入されたのではなく作成されたすべてのインスタンスはモック化できないため、明らかにそれはテスト不可能性につながります。

@vascowhite が指摘したように、無駄のないコントローラーを目指して努力することも一般的に良いことです。つまり、できるだけ多くのロジックをモデル レイヤーに移動します。これにより、冗長性 (DRY) が少なくなり、同時にテスト容易性が向上します。

ただし、モデルを肥大化させないように注意してください。ある時点で、いくつかのコードを追加のコンポーネントに分解したくなるでしょう。

追加の問題は、シングルトンであるため、Front Controller もモックできないことです。したがって、そのようなアクションをテストするためのオプションはあまりありません。唯一のオプションは、メンバー インスタンスを挿入するか、レジストリから取得することです (どちらも良い考えではありません)。

以上のことから、アクション テストのために完全な隔離を達成できないことは明らかです。しかし

ただし、ZF2 のテストははるかに簡単です。

于 2012-02-26T11:27:06.157 に答える
1

コントローラーを機能テストでカバーすることから始めたほうがよいでしょう。この場合、このモックの問題を回避して、テストのカバレッジを向上させることができます。コントローラーは強く結合されているため、単体テストでカバーするのは常に困難です。

ZF で機能テストを作成するには、Codeception の使用を検討してください: http://codeception.com/01-27-2012/bdd-with-zend-framework.html

また、コントローラーの単体テストを作成する方法の例もいくつかあります。ただし、コントローラーの機能テストを行った後で、コントローラーの単体テストを行うことをお勧めします。

http://codeception.com/docs/06-UnitTestsAndBDD#TestingController

于 2012-02-27T23:37:00.327 に答える