0

プロジェクトをビルド スクリプトに含めるためのテスト ケースの実装に取り​​組んでいます。この CakePHP 2.4 アプリケーションは大部分が REST ベースであり、routes.php ファイルで json 拡張機能を解析するように設定されています。アプリケーションの典型的な関数の例を次に示します。

public function index() {
    $this->paginate = array(
        'fields' => array('User.username', 'User.first_name', 'User.last_name', 'UserGroup.name','Location.name','User.id'),
        'conditions' => array(
            'active'=>1
        ),
        'link' => array('UserGroup','Location')
    );
    $this->set('response', $this->RestApi->getResponse());
    $this->set('_serialize','response');
}

これは、次のような json 構造を返します。

{"sEcho":1,"iTotalRecords":16,"iTotalDisplayRecords":14,"aaData":[["admin","Administrative"],["salesman","Salesman"]]}

そのため、テスト ケースを作成するときに、この URL を呼び出すと JSON 応答が返されることを期待していました。テストの 1 つは、それを適切にデコードし、データの検証に進むことです。問題は、testAction の呼び出しが何も返さないことです (ビューとコンテンツを返すように指示しようとしました)。応答にアクセスできる唯一の方法は、戻り値を見ることです。

例 - 機能しない:

$result = $this->testAction('/users/index.json',array(
    'method' => 'GET',
    'return' => 'contents'
));
var_dump($result); // NULL

例 - 機能しています:

$result = $this->testAction('/users/index.json',array(
    'method' => 'GET',
    'return' => 'vars'
));

では、変数を見ることの問題は何ですか? その 1 つは、アプリケーションがどのように機能するかを示す実際の例よりも少し先です。また、基本的な単体テストが期待どおりに機能しない場合、アーキテクチャについて少し心配になります。

アドバイスをお願いします。読んでくれてありがとう!

編集: HTML を返すだけの URL など、残りの URL に対して testAction を実行しても、まだ応答がないことを追加する必要があります。HTMLなどはありません...

4

1 に答える 1

0

私は最終的にこれを解決しました。Auth コンポーネントを無効にする必要がありました。テスト自体でこれを行う方法についてのブログやディスカッション スレッドがいくつかありますが、すべてのテストで同じコードを繰り返さなければならないのは面倒に思えました。私の解決策は、テストの実行時に Auth コンポーネントを自動的に無効にすることでした。

AppController::beforeFilter では:

// For Mock Objects and Debug >= 2 allow all (this is for PHPUnit Tests)
if(preg_match('/Mock_/',get_class($this)) && Configure::read('debug') >= 2){
    $this->Auth->allow();
}

デプロイのコア機能を重視しているため、これは非常にエレガントだと感じました。Auth / ACL コンポーネントが想定どおりに機能していることを検証する単体テストを作成する予定です。

于 2013-11-07T15:12:19.923 に答える