前提・実現したいこと
クラブ退会処理のメソッドをテストしようとしているのですが、postリクエストを送ってみると500エラーが返ってきます
以下のようにログインなどしていない場合、リダイレクト処理がはしるようになっているのですがそのようになりません
そもそもメソッドの直下でvar_dump($this->request->is('post'));としても何も出なかったため、テスト対象箇所にテストコードの中で発行したリクエストが到達していないようでした
自分ではおかしい部分がどこなのか気づけませんでした
そもそもチェックの仕方はこうではないかなどありましたらご指摘いただきたいです
検証箇所のコントローラー
<?php namespace App\Controller; use Cake\Core\Configure; use App\Controller\AppController; use Facebook\Facebook; use App\Model\Table\SubscriptionStatusesTable; use App\Controller\Component\MailComponent; use Cake\Controller\ComponentRegistry; use App\Model\Table\ClubMemberStatusesTable; use Cake\Datasource\ConnectionManager; use Cake\I18n\Time; class ClubsController extends AppController { public $facebook__appID = null; public $facebook__appSecret = null; public $facebook__callbackUrl = null; public $errorRedirectUrl = null; public function initialize() { parent::initialize(); $this->loadComponent('Utility'); $this->loadComponent('OAuthFacebook'); $this->loadModel('Members'); $this->loadModel('Users'); $this->loadModel('UserInfos'); $this->loadModel('Subscriptions'); $this->loadModel('SubscriptionStatuses'); $this->loadModel('ClubsUsers'); $this->loadModel('ClubMemberStatuses'); $this->loadModel('MailChanges'); $this->loadModel('Leaves'); $this->facebook__appID = Configure::read('OAuth.Facebook.appId'); $this->facebook__appSecret = Configure::read('OAuth.Facebook.appSecret'); $this->facebook__callbackUrl = Configure::read('OAuth.Facebook.callbackUrl'); $this->errorRedirectUrl = Configure::read('OAuth.Error.redirectUrl'); $this->_payjpApiSecretKey = Configure::read('Payjp.Api.secretKey'); } /** * Before filter */ public function beforeFilter(\Cake\Event\Event $event) { parent::beforeFilter($event); $this->Auth->allow(['view', 'leave', 'index']); } ・・・略 public function leave($clubId) { var_dump($this->request->is('post')); *この状態で何も反応しなかった // 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()); } if(!$this->Auth->user()) { return $this->redirect("/authentications/login_for_leave/" . $clubId); } else { $this->request->getSession()->write('currentClub', $clubId); $this->request->getSession()->write('inquiryUrl', $club["inquiry_form_url"]); } if ($this->request->is('post')) { \Payjp\Payjp::setApiKey($this->_payjpApiSecretKey); $payjpPlanId = $club["club_plans"][0]["payjp_plan_id"]; // Check user has subscription $sub = $this->Subscriptions->find() ->where([ 'Subscriptions.club_id' => $clubId, 'Subscriptions.user_id' => $this->Auth->user('id'), 'Subscriptions.payjp_plan_id' => $payjpPlanId, 'Subscriptions.subscription_status_id <>' => SubscriptionStatusesTable::ID_PERIODIC_BILLING__CANCEL ])->first(); if (empty($sub)) { $this->Flash->error("入会情報が見つかりません。"); return $this->redirect($this->referer()); } try { $su = \Payjp\Subscription::retrieve($sub["payjp_subscription_id"]); $su->delete(); } catch (Exception $e){ $this->Flash->error("定期決済の解除に失敗しました。サポートまでお問い合わせください。"); return $this->redirect($this->referer()); } // データ更新 $subscription = $this->Subscriptions->get($sub["id"], [ 'contain' => ['Clubs.ClubOwners.Users', 'Users.UserInfos'] ] ); $subscription = $this->Users->patchEntity($subscription, [ "subscription_status_id" => SubscriptionStatusesTable::ID_PERIODIC_BILLING__CANCEL, "canceled" => date("Y-m-d H:i:s") ]); $this->Subscriptions->save($subscription); // メール送信処理 ・・・略 return $this->redirect("/Clubs/complete_leave/" . $clubId); } $this->render(sprintf('%s/leave', $clubId)); }
発生している問題・エラーメッセージ
1) App\Test\TestCase\Controller\ClubsControllerTest::testLeave Status code is not between 200 and 204 Failed asserting that 500 is equal to 204 or is less than 204.
該当のソースコード
<?php namespace App\Test\TestCase\Controller; use App\Controller\ClubsController; use Cake\Core\App; use Cake\Core\Configure; use Cake\Http\Response; use Cake\Http\ServerRequest; use Cake\TestSuite\IntegrationTestCase; use Cake\View\Exception\MissingTemplateException; class ClubsControllerTest extends IntegrationTestCase { public function setUser(){ //ログインしている状態の作成 $login = $this->session([ 'Auth' => [ 'User' => [ 'id' => 'id', ・・・略 ] ] ]); return $login; } /** * Test leave method * * @return void */ public function testLeave() { $this->setUser(); $this->post('/clubs/leave/clubid'); $this->assertResponseOk(); // $this->assertResponsezCode(302); // $this->assertResponseNotEmpty(); // $this->assertTemplate('leave'); // $this->markTestIncomplete('Not implemented yet.'); } }
試したこと
念のためテスト対象のコントローラーのbeforeFilterと、initializeをコメント会うとにしてみましたが変化はありませんでした
ブラウザで普通に操作はできるのでこのメソッドそのものに問題があるわけではないということはわかっています
テストコードの書き方に問題があるということはわかっているのですが、どうして500エラーが返ってくるのかがわかりません
通常疑うべきポイントどのような箇所があるでしょうか?
補足情報(FW/ツールのバージョンなど)
cakephp3.5 MAMP PHP7 Mysql FaceBookSDK
回答1件
あなたの回答
tips
プレビュー