質問

Zend Frameworkで作成した現在のプロジェクトのテストを書いています。 すべては問題ありませんが、ログに記録されたユーザーのアクション/コントローラーのテストに問題があります。アクション/コントローラーを実行するにはログインする必要があります。

PHPUnitでログインするにはどうすればよいですか

役に立ちましたか?

解決

アクション/コントローラーをテストしたいということは、ユニットテストではなく、機能/統合テスト、つまり、 Zend_Test で作業し、MVCを介してテストするということです。

ここで、プロジェクトで使用したテスト関数を示します。ここでは、ログインが正常かどうかをテストしています:

public function testLoggingInShouldBeOk()
{
    $this->dispatch('/login/login');
    $csrf = $this->_getLoginFormCSRF();
    $this->resetResponse();
    $this->request->setPost(array(
        'login' => 'LOGIN',
        'password' => 'PASSWORD',
        'csrfLogin' => $csrf,
        'ok' => 'Login',
    ));
    $this->request->setMethod('POST');
    $this->dispatch('/login/login');
    $this->assertRedirectTo('/');
    $this->assertTrue(Zend_Auth::getInstance()->hasIdentity());
}

簡単:ログインフォームを読み込んで、CSRFトークンを抽出し、フォームに入力して、投稿します。

その後、接続しているかどうかをテストできます。


これにより、ログイン部分を抽出して、有効なユーザーのログインを必要とする各テストの前に呼び出すことができます。

他のヒント

別の方法があります。 User エンティティには、ユーザーのIDをセッションと静的変数に入れる login()メソッドがあります。テスト setUp()で行うことは、 $ user-> login()を呼び出すことです。テスト環境ではセッションは使用されず( Zend_Session :: $ isUnitTested = true を設定するとこの効果があります)、テストは静的変数に依存します。 tearDown()で静的変数( logout()ユーザー)をクリアすることを忘れないでください。

この記事はあなたに役立つと思います: http://perevodik.net/en/posts/7/ ログインしているユーザーと同等の状態に環境を設定するために使用できる偽のIDを作成する方法について説明します。

Pascalがこの関数を使用するのとほぼ同じ方法で:

$this->_getLoginFormCSRF();

フォーム要素マネージャーを使用してフォームをロードすることで値を返す汎用関数を作成しました:

  

public function _getCSRFHashValueFromForm($ formAlias、$ csrfName){       $ form = $ this-> servicemanager-> get( 'FormElementManager')-> get($ formAlias);       return $ form-> get($ csrfName)-> getValue(); }

もちろん、これはCSRFがフォームにバインドされており、フィールドセットなどの中にないことを前提としています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top