5

CakePhp で単体テストを使用する方法を学ぼうとしていたのですが、コントローラー テストを作成しようとしています。testAction() および debug() 関数について読みましたが、うまくいきません。つまり、テスト メソッドはパスしますが、debug() は null を返します (testAction がパスするため)。

これは私のコードです:

<?php
App::uses('Controller', 'Controller');
App::uses('View', 'View');
App::uses('PostsController', 'Controller');

class PostsControllerTest extends ControllerTestCase {
    public function setUp() {
       parent::setUp();
       $Controller = new Controller();
       $View = new View($Controller);
       $this->Posts = new PostsController($View);
    }

    public function testIndex() {
          $result = $this->testAction('Posts/Index');
        debug($result);        

    }
}

投稿/インデックス コントローラーは、DB に保存されているすべての投稿のリストを返します。

4

2 に答える 2

10

CakePHP 2 を使用していると仮定しています。

$this->testAction()指定したオプションに応じて、いくつかの異なる結果を返すことができます。

たとえば、returnオプションをに設定するvarsと、testAction()メソッドはテスト対象のアクションで設定された変数の配列を返します。

public function testIndex() {
    $result = $this->testAction('/posts/index', array('return' => 'vars'));
    debug($result);
}

この例では、デバッグ データは、/posts/indexアクションで設定した変数の配列である必要があります。

CakePHP のドキュメントでは、返される可能性のある結果について説明しています: http://book.cakephp.org/2.0/en/development/testing.html#choosing-the-return-type

デフォルトのオプション は、コントローラ アクションが返すresult値を与えることに注意してください。ほとんどのコントローラー アクションの場合、これは になるため、例を取得しているという事実が予想されます。nullnull

于 2012-09-22T10:33:38.650 に答える
1

mtnorthrop の答えは私にとってはうまくいきましたが、サイトの承認も一度だけ処理しました。あなたのサイトが承認を使用している場合、testAction('/action', array('return' => 'contents') は null を返します。これについては、いくつかの解決策を見てきました。

1 つは、次の解決策に従うことです: CakePHP ユニット テストがコンテンツまたはビュー を返さない場合、 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();
}

もう 1 つは、https://groups.google.com/forum/#!topic/cake-php/eWCO2bf5t98 のディスカッションで示されている提案に従い、ControllerTestCase の生成関数を使用して Auth オブジェクトをモックすることです。

class MyControllerTest extends ControllerTestCase {
    public function setUp() {
        parent::setUp();
        $this->controller = $this->generate('My',
            array('components' => array(
                'Auth' => array('isAuthorized')
            ))
        );
        $this->controller->Auth->expects($this->any())
            ->method('isAuthorized')
            ->will($this->returnValue(true));

    }
}

注(CakePhp 2.3.8を使用しています)

于 2014-04-09T21:52:36.093 に答える