単体テスト(PHPUnit):ログイン方法
-
05-07-2019 - |
質問
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がフォームにバインドされており、フィールドセットなどの中にないことを前提としています。