6

アクションがあるとします:

function actionShowItem($id)
{
    $item = Item::model()->findByPk($id);
    $this->render("showitem",array('model' => $id));
}

ビュー出力のテキストを検証する、このアクションの単純な単体テストは何ですか。セレンを使用せずに簡単に zend フレームワークを使用できます。zend では偽の GET と POST も作成できます。しかし、Yii で同じ例は見つかりませんでした。提案してください。

4

1 に答える 1

3

Yii PHP フレームワークは多くの面で非常に優れていますが、シミュレートされたコントローラー アクションの出力テストを内部的にサポートしていないのは非常に残念です。Selenium ベースの Web ブラウザ メソッドしかありません。私は ZendF から Yii に来ましたが、zend には xpath ベースのアサーションを含む優れたテスト システムがあります。そのため、コード フローを理解し、components/Controller.php 内でこれをコーディングする必要がありました。私の意見では、Yii の魅力である中核となる yii フレームワークを変更せずにそれを行うことができました。

すべてのクライアント コードには、Yii のすべてのコントローラに共通の基本クラスである components/Controller.php があります。render は CController メソッドです。つまり、それをオーバーライドして、ユニット テスト コードで使用するビュー出力をキャプチャできます。

テストランかプロダクションかを識別するには、runmode パラメータ (config/main.php 内) が必要です。テスト実行では何もエコーできませんが、本番出力では単純にエコーされます(ユニットテストレポートが台無しになります)。テスト コードでは、ラッパーの xpath または strpos チェックをアサートできる $render_output で出力を取得します。このハックは最高ではありませんが、うまく機能します。

function render($view,$data=null,$return=false)
{
    $out = parent::render($view,$data,true);

    if(isset(Yii::app()->params['runmode']) 
       && Yii::app()->params['runmode'] == 'test')
    {
        global $render_output;
        return $render_output = $out;
    }

    if($return)
        return $out;
    else
        echo $out;

}
于 2012-08-13T10:00:20.157 に答える