質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

Q&A

解決済

1回答

4596閲覧

CakePHP3 PHPUnitテストでログイン情報をデータベースをもとに使いたい

massy7

総合スコア45

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

0グッド

0クリップ

投稿2017/09/27 08:40

編集2017/09/28 05:49

###前提・実現したいこと

  • Cakephp3.4.9
  • PHPUnit 6.3.1

usersテーブルに保存されているユーザーデータ(id,email,password)を持ってきて、
ログインしていないとログイン画面にリダイレクトされるテストをしたい。

###発生している問題・エラーメッセージ

php

1 // テスト 2 $this->session( 3 [ 4 'Auth' => [ 5 'User' => [ 6 'id' => 1, 7 'user_id' => 'test', 8 'email' => 'test@test.com', 9 'password' => 'test' 10 ] 11 ] 12 ] 13 ); 14 $this->get('/test/test'); 15 $this->assertResponseOk();

で、どんなデータを入れてもログインに成功(リダイレクトされず、assertResponseOkが通る)してしまう。

実際のブラウザでは当然間違ったログインは弾かれるようにしています。

php

1 // コントローラ 2 $this->loadComponent('Auth',[ 3 'authorize' => 'Controller', 4 'authenticate' => [ 5 'Form' => [ 6 'fields' => [ 7 'username' => 'email', 8 'password' => 'password' 9 ] 10 ] 11 ], 12 'loginAction' => [ 13 'controller' => 'CONTROLLER', 14 'action' => 'login' 15 ], 16 'loginRedirect' => [ 17 'controller' => 'CONTROLLER', 18 'action' => 'index' 19 ], 20 'logoutRedirect' => [ 21 'controller' => 'CONTROLLER', 22 'action' => 'login', 23 ] 24 ]);

追記

UsersFixture

php

1 public $records = [ 2 [ 3 'id' => 1, 4 'user_id' => 'test', 5 'email' => 'test@test.co.jp', 6 'password' => 'test', 7 'deleted' => 0 8 ], 9 ];

test

php

1 public $fixtures = [ 2 'app.users' 3 ];

loginAction

php

1 public function login() 2 { 3 if($this->request->is('post')){ 4 $user = $this->Auth->identify(); 5 if($user){ 6 $this->Auth->setUser($user); 7 return $this->redirect($this->Auth->redirectUrl()); 8 } 9 $this->Flash->error('ユーザー名かパスワードが間違ってます.'); 10 } 11 }

と読み込んでおり、ログイン画面にPostしたところ、リダイレクトは通ります($this->assertResponseSuccessで判定、実際はログイン成功時はindexへ、失敗時はloginへ)、assertSessionの値が合いません。
つまりログインできていないのでしょうか?
また、

php

1$this->assertRedirect(['controller' => 'CONTROLLER', 'action' => 'index']);

がNo location header set.となってしまうため、リダイレクト先が正しいかの判断ができません。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$this->session()に認証した結果の情報を設定してアクセスしているので、テストコードとしてはリダイレクトされないで正しいと思いますよ。$this->session()をしないで$this->get('/test/test');をすれば、リダイレクトされると思います。

パスワードが正しいかどうかは、認証の際にのみ確認されます。ログイン中かどうかは、sessionにAuthがあるかないかだけで判断されます。


追記 簡単なログインの成功と失敗のテストサンプル

// ログイン成功 $this->post('/users/login', [ 'email' => 'test@example.jp', 'password' => 'okpass' ]); $this->assertResponseSuccess(); // リダイレクト $this->assertSession(1, 'Auth.User.id'); // セッションがあるか // ログイン失敗 $this->post('/users/login', [ 'email' => 'test@example.jp', 'password' => 'badpass' ]); $this->assertResponseOk(); // 入力画面に戻される $this->assertSession(null, 'Auth.User.id'); // セッションはない $this->assertResponseContains('メールアドレスまたはパスワードが違います。');

補足ですが、事前にフィクスチャなどでDB側にログインしようとしているユーザ情報が登録されている必要があります。

投稿2017/09/28 04:49

編集2017/09/28 05:05
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

massy7

2017/09/28 04:52

通常のログインのようにメールアドレス、パスワード、その他情報が正しいかどうかのテストはできないという認識で良いということでしょうか?
popobot

2017/09/28 04:55 編集

それはログインのURLに対して、post()してポストデータにemailやpasswordを送れば確認できますよ ※ログイン失敗をテストしたければ、passwordを不正のものにすればできます。 ※ログインできたかどうかは、セッションができたかどうかで判断できます。
massy7

2017/09/28 05:43

サンプルありがとうございます。 試してみたのですが、どうもうまく行きません。データベースやFixtureのエラー等はphpunitで出ていていないのですが、どこが原因である可能性がありますでしょうか? 質問に追記させていただきました。よろしくお願いいたします。
popobot

2017/09/28 05:48

フィクスチャのパスワードは、暗号化後の値でないとだめだからかもしれません。
massy7

2017/09/28 05:55

ありがとうございます!解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問