3

CakePHP 2.2 RC1を使用してアプリケーションをテストしようとしていますが、コントローラーの特定のアクションでAuthオブジェクトの情報が1つ必要です。テストでは、Authコンポーネントのモックオブジェクトを作成しましたが、モックでメソッド呼び出すとオブジェクトが無効になります。これを入れないと、すべてが正常に機能します。

動作しないモックオブジェクトの下

$this->controller->Auth
    ->staticExpects($this->any())
    ->method('user')
    ->with('count_id')
    ->will($this->returnValue(9));

注目してくれてありがとう。

-

編集

私のテストケースの完全なコードの上に、これは非常に単純なテストです。

class TagsControllerTest extends ControllerTestCase {
    public function testView(){
        $Tags = $this->generate('Tags', array(
            'components' => array(
                'Session',
                'Auth' => array('user')
            )
        ));
        $Tags->Auth->staticExpects($this->any())
            ->method('user')
            ->with('count_id')
            ->will($this->returnValue(2));

        $result = $this->testAction('/tags/view');
        $this->assertEquals($result, 2);
    }
}

そして、タグコントローラーでの私のアクションのコードです。これには(テスト目的で)count_idをパラメーターとして持つユーザーオブジェクトの戻り値はありません。

public function view(){
    return $this->Auth->user('count_id');
}

テストを実行すると、次のメッセージが表示されます。

メソッド名の期待値は、0回以上呼び出された場合と同じです。呼び出しのパラメーター0 AuthComponent :: user(null)が期待値と一致しません。nullが期待される'count_id'と一致することの表明に失敗しました。

4

2 に答える 2

1

提供されたソリューションでは解決できない同じ問題に直面していました。

解決策は、ユーザーが静的関数であるため、expects() の代わりに staticExpects() を使用することです。

$batches->Auth->staticExpects($this->once())->method('user') 
        ->with('id')
        ->will($this->returnValue(1)); 
于 2012-08-01T12:42:11.097 に答える
1

コードを見た後AuthComponent、問題はコンポーネント全体をモックしていない_getUser()メソッドをモックしていないという事実にあると思います。忘れないでください:モックしていないメソッドは実際のメソッドです!

コードを見ると、user()が によって呼び出され、 が によって呼び出され_getUser()ていることがわかりますstartup()

この問題を解決するには 2 つの方法があります。1 つ目は、全体をモックすることAuthComponentです。

$Tags = $this->generate('Tags', array(
        'components' => array(
            'Session',
            'Auth' /* no methods */
        )
    ));

_getUser()またはに加えてモックuser()

$Tags = $this->generate('Tags', array(
        'components' => array(
            'Session',
            'Auth' => array('user', '_getUser')
        )
    ));

うまくいけば、これで問題が解決するはずです。

于 2012-07-06T11:16:53.553 に答える