3

私は一般的にphpunitとユニットテストに不慣れです。大きなアプリをcakephp2.0に変換して、すべての単体テストを作成しようとしています。

$ this-> Session-> read('Auth.Account.id')が呼び出されると、144を返すモックオブジェクトを作成しようとしています...これにより、アイテムを持つIDを持つアカウントが提供されます。

ただし、さまざまなbeforeFilter呼び出しで他のSession :: read('AuthCode')呼び出しでモックがエラーになっているように見えるため、エラーが発生します。

メソッド名の期待値は、1回呼び出されたときに等しいです。呼び出しのパラメータ0 SessionComponent :: read('AuthCode')が期待値と一致しません。2つの文字列が等しいことを表明できませんでした。

私が言ったように、私はphpunitとユニットテストに不慣れです...私は何が間違っているのですか?

class PagesController extends MastersController {
        public function support(){
        if($this->Session->read('Auth.Account.id')) {
            $items = $this->Account->Items->find('list', array('conditions'=>array('Items.account_id'=>$this->Session->read('Auth.Account.id'))));           
        }
        $this->set(compact('items'));
    }
}


class PagesControllerTestCase extends CakeTestCase {
        /**
     * Test Support
     *
     * @return void
     */
    public function testSupport() { 
        #mock controller
        $this->PagesController = $this->generate('Pages', array(
            'methods'=>array('support'),
            'components' => array(
                'Auth',
                'Session',
            ),
        ));

                #mock controller expects
        $this->PagesController->Session->expects(
            $this->once())
                ->method('read') #Session:read() method will be called at least once
                ->with($this->equalTo('Auth.Account.id')) #when read method is called with 'Auth.Account.id' as a param
                ->will($this->returnValue(144)); #will return value 144


        #test action
        $this->testAction('support');
    }
}
4

2 に答える 2

1

セッションを手動で書き出すことにしました。それらが行うように、コアのSessionComponentTestがあります。

https://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/Component/SessionComponentTest.php

于 2012-05-16T19:46:26.020 に答える
1

Authセッション変数には、Sessionコンポーネントではなく、Authコンポーネントを使用してアクセスする必要があります。

それ以外の

if($this->Session->read('Auth.Account.id')) {

試す

if ($this->Auth->user('Account.id')) {

同じことがあなたのItems::findcallにも当てはまります。

Authコンポーネントをモックすることはまだ道のりです。

class PagesControllerTestCase extends CakeTestCase {

する必要があります

class PagesControllerTestCase extends ControllerTestCase {

そしてあなたのテストで:

$PagesController = $this->generate('Pages', array(
    'methods'=>array('support'),
    'components' => array(
        'Auth' => array('user')
     ),
));

$PagesController->Auth->staticExpects($this->exactly(2))
    ->method('user')
    ->with('Account.id')
    ->will($this->returnValue(144));
于 2012-05-27T04:28:23.853 に答える