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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

CakePHP

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

PHPUnit

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

Q&A

解決済

1回答

1708閲覧

cakephp3でのcontrollerのユニットテストについて

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

CakePHP

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

PHPUnit

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

0グッド

1クリップ

投稿2019/11/25 09:51

編集2019/11/26 03:48

前提・実現したいこと

cakephpでのユニットテストを初めて書く者です

facebookログインをしているユーザーのみが実行可能なメソッドのテストをしたいと思い、まずログインしていない状態・ログインしている状態を作り出したテストメソッドを投げ、うまくいっているか確認したいと思いました

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

サイトへfacebookログインしていないとリダイレクトされる部分の処理なので、ユーザーがログインしている場合とそうでない場合をまずテストしたいのですが両方共同じ結果になってしまいます

一つ目のユーザーログインしていない前提のものは、リダイレクトされたという趣旨のレスポンス
二つ目の方は、200が返ってこないといけないと思っているのですがこの前提そのものが違います出ようか?

該当のテストコード

<?php namespace App\Test\TestCase\Controller; use App\Controller\PaymentsController; use Cake\TestSuite\IntegrationTestCase; class PaymentsControllerTest extends IntegrationTestCase { /** * Fixtures * * @var array */ // public $fixtures = [ // 'app.users', // 'app.clubs', // 'app.club_plans', // 'app.subscriptions', // 'app.user_infos', // 'app.clubs_users' // ]; public function testPayNoUser() { $clubId = 'テスト用DBに入れたクラブID'; $this->get('/payments/pay/'. $clubId); $this->assertResponseOk(); // セッションはない $this->assertSession(null, 'Auth.User.id'); $this->assertRedirectContains("/authentications/login_for_pay/" . $clubId); } public function testPay() { // セッションデータのセット $this->session([ 'Auth' => [ 'Users' => [ 'id' => 'テスト用のDBに入れたユーザーID', ] ] ]); $clubId = 'テスト用DBに入れたクラブID'; $this->get('/payments/pay/'. $clubId); $this->assertResponseOk(); $this->assertSession(1, 'Auth.User.id'); } }

レスポンス

PHPUnit 6.5.14 by Sebastian Bergmann and contributors. FF 2 / 2 (100%) Time: 356 ms, Memory: 10.00MB There were 2 failures: 1) App\Test\TestCase\Controller\PaymentsControllerTest::testPayNoUser Status code is not between 200 and 204 Failed asserting that 302 is equal to 204 or is less than 204. /Applications/MAMP/htdocs/app_name/vendor/cakephp/cakephp/src/TestSuite/IntegrationTestCase.php:794 /Applications/MAMP/htdocs/app_name/vendor/cakephp/cakephp/src/TestSuite/IntegrationTestCase.php:711 /Applications/MAMP/htdocs/app_name/tests/TestCase/Controller/PaymentsControllerTest.php:56 2) App\Test\TestCase\Controller\PaymentsControllerTest::testPay Status code is not between 200 and 204 Failed asserting that 302 is equal to 204 or is less than 204. /Applications/MAMP/htdocs/app_name/vendor/cakephp/cakephp/src/TestSuite/IntegrationTestCase.php:794 /Applications/MAMP/htdocs/app_name/vendor/cakephp/cakephp/src/TestSuite/IntegrationTestCase.php:711 /Applications/MAMP/htdocs/app_name/tests/TestCase/Controller/PaymentsControllerTest.php:76 FAILURES! Tests: 2, Assertions: 8, Failures: 2.

元のコントローラー

public function pay($clubId = null) { if(!$this->Auth->user()) { return $this->redirect("/authentications/login_for_pay/" . $clubId); } // Check club id if (empty($clubId)) { $this->Flash->error(__('Invalid request.')); return $this->redirect($this->referer()); } // Check club data $club = $this->clubs->find() ->contain(['clubPlans']) ->where(['clubs.id' => $clubId]) ->first(); if (empty($club)) { $this->Flash->error(__('There is no club data.')); return $this->redirect($this->referer()); } ・・・

下記の記事などを参考にしています
・公式  https://book.cakephp.org/3/ja/development/testing.html#integration-testing
・コントローラー周りのテストについて
https://qiita.com/o0h/items/ea8d1b3604c37c3a8287
・各種アクションに関するテスト
https://pachicourse.com/archives/486
・テストの自動化について
https://insight.hiliberate.biz/?p=2313

ただ、そもそもどのようなレスポンスが返って来ればいいのかなど正直まだ把握しきれていません
テスト結果の読み方が間違っている・何か勘違いしていそうなどありましたらご指摘いただければと思います

補足情報(FW/ツールのバージョンなど)

cakephp3.5
mysql
PHP 7.2.22
サーバー MAMP

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

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

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

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

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

guest

回答1

0

ベストアンサー

アサーションでの確認方法の理解不十分で、各メソッドの使い方がわかっていなかったのですが以下のような書き方で認証した場合の動作を確認することができました

public function testPay($clubId = null) { $this->session([ 'Auth' => [ 'User' => [ 'id' => 'id-xxx', 'facebook_name' => 'Name', ] ] ]); $this->get('/payments/pay/'. $clubId); $this->assertSession('id-xxx', 'Auth.User.id'); }

投稿2019/11/26 07:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問